用什么函数来判断?好象用 DealSocket == INVALID_SOCKET 不行,套接字API中有函数可以判断吗?

解决方案 »

  1.   

    我记得好像会发一个FD_CLOSE消息吧?
      

  2.   

    int WSAEventSelect(
      SOCKET s,               
      WSAEVENT hEventObject,  
      long lNetworkEvents     
    );
      

  3.   

    我记得好像会发一个FD_CLOSE消息吧?
    +
    int WSAEventSelect(
      SOCKET s,               
      WSAEVENT hEventObject,  
      long lNetworkEvents     
    );将事件怎加, FD_CLOSE | FD_READ
      

  4.   

    在服务端,处理FD_CLOSE消息,消息参数中wParam即是关闭的客户端SOCKET套接字
      

  5.   

    在TCP方式,用WSAEventSelect 来处理消息,要注意FD_CLOSE可能在没有接收结束就会接到
    给你贴个例子:
    UINT CReadSocket::ReaderProc( LPVOID pArgv )
    {
    DWORD dwResult = 0;
    bool fDone = false;
    HANDLE  hArray[2] = { NULL,NULL };
    WSANETWORKEVENTS nwEvents;
    int nErr = 0;
             BOOL    bClosed = FALSE; CReadSocket * pOwner = (CReadSocket*)pArgv;
        
             if( pOwner == NULL )
                return 0; Startup();
    //
    memset( &nwEvents, 0, sizeof( WSANETWORKEVENTS)); hArray[0] = pOwner->m_hQuit;
    hArray[1] = pOwner->m_hSocketEvent;
    //
    for( ; !fDone ; )
    {
        dwResult = WSAWaitForMultipleEvents( 2, hArray, FALSE, 500, FALSE );

    switch( dwResult )
    {
    case WSA_WAIT_EVENT_0:// close event
    fDone = !fDone;
    break;
    case WSA_WAIT_EVENT_0+1:
    {
      nErr = WSAEnumNetworkEvents( pOwner->m_socket, hArray[1], &nwEvents );

    if( nErr != 0 )
    break;
    //
                    if( nwEvents.lNetworkEvents & FD_READ ){
    pOwner->OnRead( nwEvents.iErrorCode[FD_READ_BIT] );
                    } if( nwEvents.lNetworkEvents & FD_CLOSE )
    {
                        bClosed = TRUE;
    }
    if( nwEvents.lNetworkEvents & FD_ADDRESS_LIST_CHANGE )
    {
    }
    if( nwEvents.lNetworkEvents & FD_ROUTING_INTERFACE_CHANGE )
    {
    }
    }
    break;
    case WSA_WAIT_TIMEOUT:
                if( bClosed ){
                    nErr = pOwner->OnRead( 0 );
                    if( nErr == 0 || nErr == SOCKET_ERROR ){
                        fDone = true;
                        pOwner->OnClose( 0 );
                    }
                } break;
    default:
    fDone = true;
    break;
    }
    }
    pOwner->OnClose( nwEvents.iErrorCode[ FD_CLOSE_BIT] );
    Cleanup();
        TRACE( "CReadSocket Thread Exit.\n");
    return 1;
    }