socket完成数据传输任务后,我在server端和client端都调用了函数
shutdown(sNO,SD_BOTH)和closesocket(sNO),结果发现server端的socket仍处于等待状态,当超时后系统才会关闭它。怎样正确地关闭socket或者如何设置socket超时时限。(已设置了SO_DONTLINGER)
shutdown(sNO,SD_BOTH)和closesocket(sNO),结果发现server端的socket仍处于等待状态,当超时后系统才会关闭它。怎样正确地关闭socket或者如何设置socket超时时限。(已设置了SO_DONTLINGER)
{
int iResult = 0;
static struct linger lig;
lig.l_onoff=1;
lig.l_linger=0;
static int iLen=sizeof(struct linger); setsockopt(iSocketId,SOL_SOCKET,SO_LINGER,(char *)&lig,iLen);
Sleep(17);
#ifdef WIN32
iResult = closesocket(iSocketId);
#else
iResult = close(iSocketId);
#endif
return iResult;
}
比如CSOCKET,或者select都很容易自己判断是否close socket
client端可以正常关闭,但server端关闭(指调用shutdown和closesocket函数)后,socket的状态是TIME WAIT,我查了有关TCP协议的连接原理清访问http://www.rfc-editor.org第RFC793号文件,定义为:
TIME-WAIT - represents waiting for enough time to pass to be sure
the remote TCP received the acknowledgment of its connection
termination request.
如果在这个enough time 里,我又开启了其他TCP连接(大概10秒一个),系统会有足够的资源可用吗?另外这个enough time 我可以人为指定吗?
其实你这个问题换一个角度考虑就可以了.
server不主动关闭,由client主动关闭. server等client关闭后,read返回0时,被动关闭就可以了,这样server端就干净了,把TIME_WAIT留给client吧.呵呵当然实际中你要灵活运用,我估计sever/client都是你写的吧? 你可以在server端有如下的逻辑: 当准备关闭的时候, 等待client在一段时间内主动关闭, 如果client没有反应,server也只要自己自动关闭了,不可能无限等待...反正一条,谁主动谁倒霉.(需要保持TIME_WAIT状态).具体你自己把握吧.
庸人自扰!