tcp怎样链接多个socket?
我用tcp的一个服务端,但每次只能接受链接一次而且不懂怎样判断连接的socket是否断开,第二个socket连上去,就收不到数据了?怎样进行用tcp连接多个socket?并判断这个socket是否断开?
代码如下:
SOCKET sListen = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
sockaddr_in sin;
sin.sin_family= AF_INET;
sin.sin_port= htons(PORT);
sin.sin_addr.S_un.S_addr = INADDR_ANY;
if (::bind(sListen, (LPSOCKADDR)&sin, sizeof(sockaddr_in)) == SOCKET_ERROR)
{
printf("Bind Error!\n");
return;
}
// 设置socket进入监听状态
if (::listen(sListen, 10) == SOCKET_ERROR)
{
printf("Listen Error!\n");
return;
}
printf("Listening To Client...\n");
// 循环接收client端的连接请求
sockaddr_in ClientAddr;
int nAddrLen = sizeof(sockaddr_in);
SOCKET sClient;
while(1)
{
sClient = ::accept(sListen, (sockaddr*)&ClientAddr, &nAddrLen);
//后面怎样判断这个sClient是否断开?
}
[解决办法]
sClient = ::accept(sListen, (sockaddr*)&ClientAddr, &nAddrLen);
你的用法就是错的。
accept函数可以返回多个不同socket实例并须循环调用,新建线程分别处理每个socket.
而你只调用一次accept并赋值给sClient,当然只能接受一个socket.
无须判断socket是否断开,其断开的判断无通用方法.
[解决办法]
最简单的方法,你需要一个线程一直在listen,accept进来的链接新建一个线程处理。
连接是否断开你只能判断send/recv的返回状态,当然也没必要有别的方法。
[解决办法]
/// <summary> /// 开始监听 /// </summary> RequestParam *lpParameter = NULL; int addrlen = sizeof(sockaddr_in); while((lpParameter = new RequestParam) != NULL) { lpParameter->ClientSocket = ProxyPtr->ProxySocket->Accept(&lpParameter->ClientAddr, &addrlen); lpParameter->RequestThread = new System::Threading::Thread(&ProcessThreadProc, lpParameter); lpParameter->RequestThread->Start(); } return 0;
[解决办法]
accept函数可以返回多个不同socket实例并须循环调用,新建线程分别处理每个socket.
而你只调用一次accept并赋值给sClient,当然只能接受一个socket.
[解决办法]
http://download.csdn.net/detail/gaoyunjie/3540407
参考这个