sock建立连接以后,过一段时间,如何知道对方是否关闭连接??

解决方案 »

  1.   

    block型socket在对方关闭连接以后,recv/send会报错
    非block型socket,在对方关闭连接的时候,会收到FD_CLOSE事件
      

  2.   

    BOOL CMySocket::HasConnectionDropped(void)
    {
    BOOL bConnDropped = FALSE;
    INT iRet = 0;
    BOOL bOK = TRUE;

    if (m_hSocket == INVALID_SOCKET)
    return TRUE; struct timeval timeout = { 0, 0 };
    fd_set readSocketSet;

    FD_ZERO(&readSocketSet);
    FD_SET(m_hSocket, &readSocketSet);

    iRet = ::select(0, &readSocketSet, NULL, NULL, &timeout);
    bOK = (iRet > 0);

    if(bOK)
    {
    bOK = FD_ISSET(m_hSocket, &readSocketSet);
    }

    if(bOK)
    {
    CHAR szBuffer[1] = "";
    iRet = ::recv(m_hSocket, szBuffer, 1, MSG_PEEK);
    bOK = (iRet > 0);
    if(!bOK)
    {
    INT iError = ::WSAGetLastError();
    bConnDropped = (( iError == WSAENETRESET) ||
    (iError == WSAECONNABORTED) ||
    (iError == WSAECONNRESET) ||
    (iError == WSAEINVAL) ||
    (iRet == 0));
    }
    }
        return(bConnDropped);
    }CMySocket派生于CSocket
      

  3.   

    可以过一段时间就相互地发KEEPALIVE消息(就是什么事情也不做,就是告诉对方连接没有关闭的消息),如果一定的时间内收不到这种消息,就说明连接已经断开了。
      

  4.   

    不必那么麻烦
    不管是正常关闭还是非正常关闭(停电、死机),都会触发onclose事件,重载即可
      

  5.   

    to cnjj(待业王子):对tcp连接,计算机reset和停电什么的是不会触发FD_CLOSE的!我以前做的是api的socket!
    mfc的socket我没试过,如果能检测到就太好了!
      

  6.   

    我做的是api的socket!
    zyleon(zy)的方法我试过了,不行
      

  7.   

    这样的问题其实都能归结为一类。
    对方如果能正常的关闭连接,你的send()和recv()都会返回WSAECONNRESET错误。
    如果对方没有正常关闭连接,比如说突然掉线,死机,重启什么的。那就只能等待send()和recv()超时了,程序要过很久才能知道连接已经失效了。怎样立即得到通知的方法大家一直都在讨论,好像现在也没有一个很合适的普遍的解决办法。不过如果是是针对很具体的应用,一般都有特殊的办法吧。
      

  8.   

    select()可以解决这个问题,关键是以多长时间作为超时,确定了这个就可以判断出来了,
    而且select处理socket的IO多路读写都是很有效的。
    另外,如果采用Win32的完成端口模型则内核会在适当的时候让你知道的。