我的服务端程序使用acceptex,客户端套接字是事先创建好的,每次断开连接时使用transmitfile来实现套接字重用。现在有这么一个问题,当我发现对方非我预期客户或者超时时,我主动想断开连接,这时套接字长时间处在FIN_WAIT_2状态,这个原因是由于对方不响应我这边关闭造成的,也就是说,客户如果及时调用closesocket就不会有这个问题。如果客户由于某种原因不做closesocket,那我这边应该如何处理?

解决方案 »

  1.   

    服务器这边在关闭socket时调用这个:
    int CloseSocket(int iSocketId)
    {
    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);
    shutdown(iSocketId,-1);
    Sleep(17);
    #ifdef WIN32
    iResult = closesocket(iSocketId);
    #else
    iResult = close(iSocketId);
    #endif
    return iResult;
    }
      

  2.   

    to ZHENG017():
       谢谢关心,但你那方法并不能实现套接字重用,使用shutdown后,再在套接字上做操作只能是closesocket了
      

  3.   

    FIN_WAIT_2对端没有close!所以没有完全关闭.
    会超时的.
      

  4.   

    对方没有注册FD_CLOSE事件或者压根就没有想closesocket,那就毫无疑问了,现在的问题是怎么立马把它干掉,不出现等待
      

  5.   

    我干脆还是closesocket了,transmitfile在这个情况下不行