我用Socket通讯,将网线拔掉后,用Send发送字符,Send 函数的返回值不是SOCKET_ERROR,
在这种情况下我怎样才能判断到网路不通?

解决方案 »

  1.   

    发送test消息,如果n秒内收不到回复,就认为已经断开
      

  2.   

    首先,重载ONCLOSE,然后SetSockOpt(SO_KEEPALIVE,...)
      

  3.   

    请问everandforever(Forever),SetSockOpt()应该怎样用,我用了,没有起作用.
      

  4.   

    BOOL bKeepAlive = TRUE;
    SetSockOpt(SO_KEEPALIVE, &bKeepAlive, sizeof(BOOL) );
    ________
    这只能保证在一段时间内,对方没有响应时你会被通知到.你也可以自己定时去PING对方. 网线断掉这种情况是不会马上有ONCLOSE的.
      

  5.   

    to  everandforever(Forever) 
    如果客户机掉电,即使用了SetSockOpt,
    服务端好像收不到OnClose()消息
      

  6.   

    "网线断掉这种情况是不会马上有ONCLOSE的"说得对。我的解决办法是,客户端定时发个包过来。如果若干秒内没收到客户端发的包就认为连接已中断。
      

  7.   

    你的OnClose()按照如下写,就会收到正常关闭的消息
    void CRecvDataSocket::OnClose(int nErrorCode) 
    {
    switch(nErrorCode)
    {
    case 0:
    strcpy(strMessage,"函数正确执行!");
    break;
    case WSAENETDOWN:
    strcpy(strMessage,"网络子系统崩溃!");
    break;
    case WSAECONNRESET:
    strcpy(strMessage,"远端重置了连接!");
    break;
    case WSAECONNABORTED:
    strcpy(strMessage,"延时或其他与原因,放弃连接!");
    break;
    }
    this->Close();
    CAsyncSocket::OnClose(nErrorCode);
    }
    如果接收Socket设置
    BOOL D=1;
    m_RecvDataSock.SetSockOpt(SO_KEEPALIVE,&D,sizeof(BOOL)); 
    那么操作系统默认的发送数据判断对方是否连接的时间是2个小时