我想将客户端和服务器端写在同一个程序下:
客户端循环发送1,2,3,4,5,6,7到服务器端,服务器分别将他们显示出来。出现的问题是:只显示了1,后面的2,3,4,5,6,7无法显示。下面是我的代码:
char recvBuf[100];
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err; wVersionRequested = MAKEWORD(1, 1);
err = WSAStartup(wVersionRequested, &wsaData);
if( err != 0 )
{
return;
} if( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup();
return;
} HANDLE hThread1;
hThread1 = CreateThread(NULL, 0, Server, NULL, 0, NULL);
CloseHandle(hThread1); 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));

char sendBuf[100];
for(int i = 1; i <= 7; ++i)
{
sprintf(sendBuf, "[ %d ]", i);
send(sockClient, sendBuf, strlen(sendBuf) + 1, 0);
Sleep(100);
}

WSACleanup();}DWORD WINAPI Server(
LPVOID lpParameter
)
{ 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, 5);

SOCKADDR_IN addrClient;
int len = sizeof(SOCKADDR);
while(1)
{
SOCKET sockConn = accept(sockSrv, (SOCKADDR*)&addrClient, &len);
recv(sockConn, recvBuf, 100, 0);
printf("%s\n", recvBuf);
recvBuf[0] = '\0';
Sleep(100);
closesocket(sockConn);
}
}

解决方案 »

  1.   

    你把closesocket(sockConn);这行代码方在while(1)里面是什么用处?接收一次就关闭?
      

  2.   

    即使去掉这行语句,closesocket(sockConn);
    也不能工作啊。
      

  3.   

    你的程序的问题出现在客户端的Connect哪里。
    connect(sockClient, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));char sendBuf[100];
    for(int i = 1; i <= 7; ++i)
    {
    sprintf(sendBuf, "[ %d ]", i);
    send(sockClient, sendBuf, strlen(sendBuf) + 1, 0);
    Sleep(100);
    }
    你先Connection了,然后去做循环,而服务端的While循环又把套接字关闭了,需要重新Connect。不Connect就不能再建立连接了。
      

  4.   

    这次,我将connect语句写在了循环中。
    可是还是不工作。如果将线程函数中的
    //recvBuf[0] = '\0';
    //Sleep(100);
    这两句注释掉。
    closesocket(sockConn);结果打印很多个[1],但是数量又不是[7]个。
      

  5.   

    你的accept在while里面,每次连接都重置了。
      

  6.   

    把while里的closesocket去掉,把accept放到while之外,这样修改试试。