CLOSE_WAIT这个状态,如何能被检测到和处理?

时间:2022-01-02 15:20:02
TCP的状态转移图上是这样说的:

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


引用 2 楼  的回复:
1,应该是自动完成的。2,能检测到。


我现在遇到的问题是:
一方断开了连接,一方过了几个小时以后才检测到close状态事件。这可能会是什么原因呢?

#4


没有发断开的数据是个假连接。或网络中间丢弃了断开的信号。导致对方没有收到。

#5


TCP的具体实现,这些都是系统内核在处理

#1


自己顶起来!

#2


1,应该是自动完成的。2,能检测到。

#3


引用 2 楼  的回复:
1,应该是自动完成的。2,能检测到。


我现在遇到的问题是:
一方断开了连接,一方过了几个小时以后才检测到close状态事件。这可能会是什么原因呢?

#4


没有发断开的数据是个假连接。或网络中间丢弃了断开的信号。导致对方没有收到。

#5


TCP的具体实现,这些都是系统内核在处理