请问TCP阻塞+多线程有关问题
请教TCP阻塞+多线程问题
如下实现多线程阻塞
线程代码
现有客户端1
send一个字节,再recv255个字节,然后closesocket
客户端2
循环 send一个字节,再recv255个字节。
服务器对应处理代码为
现象:
只启动n个客户端1,工作正常(这是当然的)
启动n个客户端2,第一个正常,第二个以上不能连接。
启动1个客户端2,再启动一个客户端1,工作正常,但再启动一个客户端2,也连接失败。
请问问题有可能出现在哪里呢?
是不是对应循环发送消息的线程需要将socket休眠之类的?
------解决方案--------------------
没看懂,应该把修改部分做一下说明
如下实现多线程阻塞
- C/C++ code
SOCKET AcceptSocket; SOCKADDR_IN addrClient; int addrClientLen = sizeof(SOCKADDR); printf("Waiting for client to connect...\n"); while(1) { if( (AcceptSocket = accept( ListenSocket1, (SOCKADDR *)&addrClient, &addrClientLen)) != SOCKET_ERROR ) { ConnectInfor * conInf = new ConnectInfor(); conInf->addrClient = addrClient; conInf->sock = AcceptSocket; CreateThread(NULL,0,SocketThread,(LPVOID)conInf,0,NULL); } }
线程代码
- C/C++ code
DWORD WINAPI SocketThread(LPVOID lpmess) { ConnectInfor * conInf = (ConnectInfor *)lpmess; char conType; int bytesRecv; bytesRecv = getByte(conInf->sock,conType); if ( bytesRecv <= 0 || bytesRecv == WSAECONNRESET ) { return 0; } switch(conType) { case CAMERA: cameraNet(conInf); break; case PLAYER: playerNet(conInf); break; } closesocket(conInf->sock); printf("close sock\n"); delete conInf; return 0; //最后不要忘记返回一个DWORD }
现有客户端1
send一个字节,再recv255个字节,然后closesocket
客户端2
循环 send一个字节,再recv255个字节。
服务器对应处理代码为
- C/C++ code
void cameraNet(ConnectInfor * conInf) { SOCKET ListenSocket = conInf->sock; char sendbuf[32] = "Server: Sending data."; char recvbuf[32] = ""; int bytesSent; int bytesRecv = SOCKET_ERROR; printf("camera connect\n"); Camera camera ; camera.getCameraInf(conInf); connectCameraList[camera.id] = camera; while(true) { char b; bytesRecv = getByte(ListenSocket,b); if ( bytesRecv <= 0 || bytesRecv == WSAECONNRESET ) { break; } switch(b) { case 100: { bytesSent = send( ListenSocket, sendbuf, strlen(sendbuf), 0 ); bytesRecv = recv( ListenSocket, recvbuf, 32, 0 ); if ( bytesRecv <= 0 || bytesRecv == WSAECONNRESET ) { printf( "Bytes Recv from %d(ip = %s:%d): Connection Closed\n",ListenSocket,inet_ntoa(conInf->addrClient.sin_addr),htons(conInf->addrClient.sin_port) ); break; } printf("from client recive: %s\n",recvbuf); } break; } Sleep(0); } printf("camera desconnect\n"); connectCameraList.erase(camera.id); }
现象:
只启动n个客户端1,工作正常(这是当然的)
启动n个客户端2,第一个正常,第二个以上不能连接。
启动1个客户端2,再启动一个客户端1,工作正常,但再启动一个客户端2,也连接失败。
请问问题有可能出现在哪里呢?
是不是对应循环发送消息的线程需要将socket休眠之类的?
------解决方案--------------------
没看懂,应该把修改部分做一下说明