//pc1
#include <stdio.h>
#include <Winsock2.h>
#pragma comment(lib, "ws2_32.lib")HANDLE xinhao;
SOCKET sockConn;
DWORD WINAPI RecvProc(LPVOID lpParameter);
DWORD WINAPI ServerProc(LPVOID lpParameter);void main(void)
{
HANDLE serverThread,recvThread;
xinhao=CreateSemaphore(NULL,1,1,NULL);
recvThread=CreateThread( NULL,0,RecvProc,NULL, 0,NULL); 
serverThread=CreateThread( NULL,0,ServerProc,NULL, 0,NULL); 

WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(2, 0);

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) 
{
return ;
}
if ( LOBYTE( wsaData.wVersion ) !=2 ||HIBYTE( wsaData.wVersion ) != 0 ) 
{
WSACleanup( );
return ;
} SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0); SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000); bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));// 绑定端口 listen(sockSrv,10); SOCKADDR_IN addrClient;// 连接上的客户端ip地址
int len=sizeof(SOCKADDR); SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len); // 接受客户端连接,获取客户端的ip地址

// Sleep(5000);
// Sleep(5000); CloseHandle(serverThread);
CloseHandle(recvThread);
CloseHandle(xinhao); closesocket(sockConn);
WSACleanup();  
getchar();
return ;
}DWORD WINAPI RecvProc(LPVOID lpParameter)
{
char recvBuf[100];
while(1)
{
recv(sockConn,recvBuf,100,0);
printf("%s\n",recvBuf);
memset(recvBuf,0x20,100);
ReleaseSemaphore(xinhao,1,NULL);
}
return 0;
}DWORD WINAPI ServerProc(LPVOID lpParameter)
{
char sendBuf[100]="发送到pc2";
while(1)
{
WaitForSingleObject(xinhao,INFINITE);
send(sockConn,sendBuf,strlen(sendBuf)+1,0);
}
return 0;
}//pc2
#include <stdio.h>
#include <Winsock2.h>
#pragma comment(lib, "ws2_32.lib")HANDLE xinhao;
DWORD WINAPI RecvProc(LPVOID lpParameter);
DWORD WINAPI ServerProc(LPVOID lpParameter);
SOCKET sockClient;void main(void)
{
HANDLE serverThread,recvThread; xinhao=CreateSemaphore(NULL,1,1,NULL);
serverThread=CreateThread( NULL,0,ServerProc,NULL,0,NULL); 
recvThread=CreateThread( NULL,0,RecvProc,NULL, 0,NULL);  WORD wVersionRequested;
WSADATA wsaData;
int err; wVersionRequested = MAKEWORD( 2, 0 ); err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) 
{
return ;
}
if ( LOBYTE( wsaData.wVersion ) !=2 ||HIBYTE( wsaData.wVersion ) != 0 ) 
{
WSACleanup();
return ;
} SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);

SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000); connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR_IN));

// Sleep(5000);
// Sleep(5000); CloseHandle(serverThread);
CloseHandle(recvThread);
CloseHandle(xinhao); closesocket(sockClient);
WSACleanup();  
getchar();
return ;
}DWORD WINAPI ServerProc(LPVOID lpParameter)
{
char sendBuf[100]="发送到pc1";
while(1)
{
WaitForSingleObject(xinhao,INFINITE);
send(sockClient,sendBuf,strlen(sendBuf)+1,0);

return 0;
}DWORD WINAPI RecvProc(LPVOID lpParameter)
{
char recvBuf[100];
while(1)
{
recv(sockClient,recvBuf,100,0);
printf("%s\n",recvBuf);
ReleaseSemaphore(xinhao,1,NULL);
memset(recvBuf,0x20,100);
}
return 0;
}

解决方案 »

  1.   

    要在accept成功后才能recv
    你一开始就创建线程recv,都还没accept,还有WSAStartup可能都没执行完
    recv肯定失败了
      

  2.   

    char recvBuf[100];
    我有初始化缓冲区啊
      

  3.   

    SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);  xinhao=CreateSemaphore(NULL,1,1,NULL);
    recvThread=CreateThread( NULL,0,RecvProc,NULL, 0,NULL); 
    serverThread=CreateThread( NULL,0,ServerProc,NULL, 0,NULL); 
    那这样行吗
      

  4.   

    在你的全局定义中SOCKET sockConn;改成SOCKET sockConn=NULL;
    在你的代码中,SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len); // 接受客户端连接,获取客户端的ip地址
    sockConn再次定义了,此时全局的sockConn被覆盖了,你accept得到的客户端线程无法使用
    在两个子线程的while中添加
    Sleep(1); //释放系统控制权,以免CPU占用率100%
    if(sockConn==NULL) 
    {
        continue;
    }
    其他的错误你自己调试
      

  5.   

    然后呢,还是不行啊//pc1
    #include <stdio.h>
    #include <Winsock2.h>
    #pragma comment(lib, "ws2_32.lib")HANDLE xinhao;
    SOCKET sockConn=NULL;
    DWORD WINAPI RecvProc(LPVOID lpParameter);
    DWORD WINAPI ServerProc(LPVOID lpParameter);int main()
    {
    HANDLE serverThread,recvThread;

    WORD wVersionRequested;
    WSADATA wsaData;
    int err;
    wVersionRequested = MAKEWORD(2, 0);

    err = WSAStartup( wVersionRequested, &wsaData );
    if ( err != 0 ) 
    {
    return 0;
    }
    if ( LOBYTE( wsaData.wVersion ) !=2 ||HIBYTE( wsaData.wVersion ) != 0 ) 
    {
    WSACleanup( );
    return 0;
    } SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0); SOCKADDR_IN addrSrv;
    addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
    addrSrv.sin_family=AF_INET;
    addrSrv.sin_port=htons(6000); bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));// 绑定端口 listen(sockSrv,10); SOCKADDR_IN addrClient;// 连接上的客户端ip地址
    int len=sizeof(SOCKADDR); SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len); // 接受客户端连接,获取客户端的ip地址
    if(sockConn==SOCKET_ERROR)
    {
    return INVALID_SOCKET;
    }
    xinhao=CreateSemaphore(NULL,1,1,NULL);
    recvThread=CreateThread( NULL,0,RecvProc,NULL, 0,NULL); 
    serverThread=CreateThread( NULL,0,ServerProc,NULL, 0,NULL);  CloseHandle(serverThread);
    CloseHandle(recvThread);
    CloseHandle(xinhao); closesocket(sockConn);
    WSACleanup();  
    getchar();
    return 0;
    }DWORD WINAPI RecvProc(LPVOID lpParameter)
    {
    char recvBuf[100];
    while(1)
    {
    Sleep(1); //释放系统控制权,以免CPU占用率100%
    if(sockConn==NULL)  
    {
    continue;
    }
    recv(sockConn,recvBuf,100,0);
    printf("%s\n",recvBuf);
    memset(recvBuf,0x20,100);
    ReleaseSemaphore(xinhao,1,NULL);
    }
    return 0;
    }DWORD WINAPI ServerProc(LPVOID lpParameter)
    { char sendBuf[100]="发送到pc2";
    while(1)
    {
    Sleep(1); //释放系统控制权,以免CPU占用率100%
    if(sockConn==NULL)  
    {
    continue;
    }
    WaitForSingleObject(xinhao,INFINITE);
    send(sockConn,sendBuf,strlen(sendBuf)+1,0);
    }
    return 0;
    }//pc2
    #include <stdio.h>
    #include <Winsock2.h>
    #pragma comment(lib, "ws2_32.lib")HANDLE xinhao;
    DWORD WINAPI RecvProc(LPVOID lpParameter);
    DWORD WINAPI ServerProc(LPVOID lpParameter);
    SOCKET sockClient=NULL;void main(void)
    {
    HANDLE serverThread,recvThread; WORD wVersionRequested;
    WSADATA wsaData;
    int err; wVersionRequested = MAKEWORD( 2, 0 ); err = WSAStartup( wVersionRequested, &wsaData );
    if ( err != 0 ) 
    {
    return ;
    }
    if ( LOBYTE( wsaData.wVersion ) !=2 ||HIBYTE( wsaData.wVersion ) != 0 ) 
    {
    WSACleanup();
    return ;
    } SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);

    SOCKADDR_IN addrSrv;
    addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
    addrSrv.sin_family=AF_INET;
    addrSrv.sin_port=htons(6000); connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR_IN)); xinhao=CreateSemaphore(NULL,1,1,NULL);
    serverThread=CreateThread( NULL,0,ServerProc,NULL,0,NULL); 
    recvThread=CreateThread( NULL,0,RecvProc,NULL, 0,NULL);  CloseHandle(serverThread);
    CloseHandle(recvThread);
    CloseHandle(xinhao); closesocket(sockClient);
    WSACleanup();  
    getchar();
    return ;
    }DWORD WINAPI ServerProc(LPVOID lpParameter)
    { char sendBuf[100]="发送到pc1";
    while(1)
    {
    Sleep(1); //释放系统控制权,以免CPU占用率100%
    if(sockClient==NULL)  
    {
    continue;
    }
    WaitForSingleObject(xinhao,INFINITE);
    send(sockClient,sendBuf,strlen(sendBuf)+1,0);

    return 0;
    }DWORD WINAPI RecvProc(LPVOID lpParameter)
    { char recvBuf[100];
    while(1)
    {
    Sleep(1); //释放系统控制权,以免CPU占用率100%
    if(sockClient==NULL)  
    {
    continue;
    }
    recv(sockClient,recvBuf,100,0);
    printf("%s\n",recvBuf);
    ReleaseSemaphore(xinhao,1,NULL);
    memset(recvBuf,0x20,100);
    }
    return 0;
    }
      

  6.   

    你代码中的这一句SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len); // 接受客户端连接,获取客户端的ip地址
    要改成:
    sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len); // 接受客户端连接,获取客户端的ip地址
      

  7.   

    服务器:Create--Bind---Listen---Accept顺序要弄清楚。
      

  8.   

    你为什么定义两个sockConn
    该一下名试试
      

  9.   

    服务器端
    SOCKET sockSrv
    bing
    listen
    sockConn
    不是这样吗