eg.
BOOL CClientSocket::HasConnectionDropped( void )
{
BOOL bConnDropped = FALSE;
INT iRet = 0;
BOOL bOK = 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 ) ); //Graceful disconnect from other side.
}
}

    return( bConnDropped );
}

解决方案 »

  1.   

    我的办法是:尽量不要用CSocket或CAsyncSocket.
    而直接用SOCKET,
    这样你可以直接开一个线程来接收数据。
    这种方法很直观。
    比如:
    while(1)
    {
      recv(sockRecv, ...);
      nError = GetLastError();
      if(nError == 0)
      {
        //收到数据
      }
      else
       if(nError == 10035)
       {
          //数据阻塞
          continue;
       }
       else
       {
          //非正常断线  
       }
    }我的大部分程序都是这样写的。
    http://microserver.top263.net
      

  2.   

    我明白你们的意思了,就是写个线程不停地收呀收呀收.....
    我开始只想到发数据才会检到网断,没想到用收的也行。>:)cctime写的看得不太懂,嘿嘿