读书人

tcp怎样链接多个socket?解决方法

发布时间: 2012-03-01 10:25:46 作者: rapoo

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的返回状态,当然也没必要有别的方法。
[解决办法]

C/C++ code
    /// <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
参考这个

读书人网 >C++

热点推荐