SERVER端:
        HANDLE h_gThread;
WSADATA wsa;
WORD wsa_res = WSAStartup(0x0101,&wsa);
int res = WSAStartup(wsa_res,&wsa);
struct sockaddr_in socket_local,socket_remote;
sListen = socket(AF_INET,SOCK_STREAM,0);
if(sListen == INVALID_SOCKET) return 0;
socket_local.sin_family = AF_INET;
socket_local.sin_port = htons(8080);
socket_local.sin_addr.S_un.S_addr = INADDR_ANY;
int bind_res = bind(sListen,(struct sockaddr*)&socket_local,sizeof(socket_local));
if(bind_res == SOCKET_ERROR) return 0;
if(listen(sListen,SOMAXCONN) == SOCKET_ERROR) return 0;
int addrlen = sizeof(socket_remote);
while(true == bl_startup)
{
sClient = accept(sListen,(struct sockaddr*)&socket_remote,&addrlen);
if(sClient == INVALID_SOCKET) continue;
skt_remote[sClient]=socket_remote;
h_gThread=CreateThread(NULL,0,begin_thread,(LPVOID)&sClient,0,NULL); 
CloseHandle(h_gThread);
}DWORD WINAPI CMcrtDlg::begin_thread(LPVOID lpPara)
{       int rec;
SOCKET sClient = *((SOCKET*)lpPara);
char buff[500];
rec=SOCKET_ERROR;
while (rec==SOCKET_ERROR) 
{
rec = recv(sClient,buff,sizeof(buff),0);
}
        send(sClient, buff, sizeof(buff), 0);
::closesocket(sClient);
}CLIENT端:
        SOCKET s;
WSADATA wsa;
WORD wsa_res = WSAStartup(0x0101,&wsa);
int res = WSAStartup(wsa_res,&wsa);
if(res == -1)return "0";
struct sockaddr_in socket_in;
s = socket(AF_INET,SOCK_STREAM,0);
if(s == INVALID_SOCKET) return "1";
socket_in.sin_family = AF_INET;
socket_in.sin_port = htons(8080);
socket_in.sin_addr.S_un.S_addr = inet_addr(cs_serip);
int con_res = connect(s,(struct sockaddr*)&socket_in,sizeof(socket_in));
if(con_res == SOCKET_ERROR)
{closesocket(s);
WSACleanup();
}
else
{
::send(s, sztextall, strlen(sztextall), 0) ;
int nRecv = ::recv(s, buff, 256, 0);
if(nRecv > 0)
{buff[nRecv] = '\0';
     closesocket(s);
     WSACleanup();
 return buff;
}
else
{
closesocket(s);
WSACleanup();
return "1031";
}

}
 }
问题1:用三台机子,一台做server,二台做client,client端for 1000次向server不停的发送信息,这时,没问题(我测试的结果)
      如果用四台机子,一台做server,三台做client,client端for 1000次向server不停的发送信息,这时,可有一台或两台机子在for了几次或几十次或几百次时就得到不server端的回应了,求原因及解决方法

解决方案 »

  1.   

    查询cmd是否有time_ wait之类close之类状态端口分配未释放
      

  2.   

    while (rec==SOCKET_ERROR) 

    rec = recv(sClient,buff,sizeof(buff),0); 

    send(sClient, buff, sizeof(buff), 0); 
    第一次成功接收后,返回值等于接收的字节数!=SOCKET_ERROR; 
    即:循环一次后,服务器发送一次,然后退出;楼主结贴吧;你发了这么多相同的;
      

  3.   

    recv与send并不一一对应。send将数据写入缓冲区就返回成功,什么时候发送由操作系统决定。有可能send 1000次,recv 900就可以接收完。
      

  4.   

    用accept处理不过来了吧? 压力太大建议用select