CLOSE_WAIT
对方主动关闭连接或者网络异常导致连接中断,这时我方的状态会变成CLOSE_WAIT 此时我方要调用close()来使得连接正确关闭。
我的问题是:
(1) 对于C/S的双方,是不是其中一方的socket句柄处于"主动关闭连接或者网络异常导致连接中断",那么另一方就自动变成CLOSE_WAIT状态? 这个是TCP/IP协议栈自动完成的?
(2) 变成"CLOSE_WAIT"的一方,VC程序的Wait函数是否一定能检测到"现在应该关闭连接"这种状态? 如果我创建的是异步的socket(overlapped绑定了一个event句柄),会不会可能检测不到?
我现在看的一个系统,用的就是异步socket,用wait函数来侦测所有的io和close事件.
但是现在发生了问题,一方断开了连接,一方过了几个小时以后才检测到close状态事件。这可能会是什么原因呢?
---------------------------------------------
我的Wait函数响应之后调用我自己写的这么一个函数。
。。。。。
{
WSANETWORKEVENTS evts;
ZeroMemory( &evts, sizeof(evts) );
//
// grab the network events that have happenned
//
WSAEnumNetworkEvents( m_hSocket, m_evtAsync, &evts );
if( evts.iErrorCode[ FD_CLOSE_BIT ] != 0 ||
evts.iErrorCode[ FD_READ_BIT ] != 0 ||
evts.iErrorCode[ FD_WRITE_BIT ] != 0 ||
evts.lNetworkEvents & FD_CLOSE )
{
Close();
m_pSink->OnIpcIOClose();
return false; // no more events please
}
//
// 先处理read再处理write(可能同时有),所以下面的代码不是else
//
if( evts.lNetworkEvents & FD_READ )
{
....
}
if( evts.lNetworkEvents & FD_WRITE )
{
....
}
return true; // we want more events
}
5 个解决方案
#1
自己顶起来!
#2
1,应该是自动完成的。2,能检测到。
#3
我现在遇到的问题是:
一方断开了连接,一方过了几个小时以后才检测到close状态事件。这可能会是什么原因呢?
#4
没有发断开的数据是个假连接。或网络中间丢弃了断开的信号。导致对方没有收到。
#5
TCP的具体实现,这些都是系统内核在处理
#1
自己顶起来!
#2
1,应该是自动完成的。2,能检测到。
#3
我现在遇到的问题是:
一方断开了连接,一方过了几个小时以后才检测到close状态事件。这可能会是什么原因呢?
#4
没有发断开的数据是个假连接。或网络中间丢弃了断开的信号。导致对方没有收到。
#5
TCP的具体实现,这些都是系统内核在处理