- 论坛徽章:
- 0
|
引用自CSDN:
CLOSE_WAIT状态的生成原因
首先我们知道,如果我们的Client程序处于CLOSE_WAIT状态的话,
说明套接字是被动关闭的!因为如果是Server端主动断掉当前连接的话,
那么双方关闭这个TCP连接共需要四个packet:
Server ---> FIN ---> Client
Server <--- ACK <--- Client
这时候Server端处于FIN_WAIT_2状态;而我们的程序处于CLOSE_WAIT状态。
Server <--- FIN <--- Client
这时Client发送FIN给Server,Client就置为LAST_ACK状态。
Server ---> ACK ---> Client
Server回应了ACK,那么Client的套接字才会真正置为CLOSED状态。
不管怎么样,我们必须防止类似情况再度发生:
首先,我们要防止不断开辟新的端口,这可以通过设置SO_REUSEADDR套接字选项做到:重用本地地址和端口:
- int nREUSEADDR = 1;
- setsockopt(sockConnected, SOL_SOCKET, SO_REUSEADDR,
- (const char*)&nREUSEADDR, sizeof(int));
复制代码
其次,我们要设置SO_LINGER套接字选项,在connect成功建立连接之后设置该选项:-
- linger m_sLinger;
- m_sLinger.l_onoff = 1; // (在closesocket()调用,但是还有数据没发送完毕的时候容许逗留)
- m_sLinger.l_linger = 0; // (容许逗留的时间为0秒)
- setsockopt(sockConnected, SOL_SOCKET, SO_LINGER, (const char*)&m_sLinger, sizeof(linger))
复制代码
不知道能否解决问题?我一般采用第二种方法,在close之前调用
[ 本帖最后由 duanjigang 于 2007-4-29 08:59 编辑 ] |
|