好象recv之类的函数返加收到的字节为零就说明连接关闭了吧

解决方案 »

  1.   

    用setsocketopt()函数,可以设置每阁一段时间检查网络是否连通。
      

  2.   

    我也想知道,是不是发送一个是否ACTIVE的数据包呀?
    是不是影响速度
      

  3.   

    1.client closesocket 之前发送一个BYEBYE packet给server。这样server就可以closesocket.
    2.send 后使用GetLastError,如为WSAESHUTDOWN 则表示SOCKET已关闭。
      

  4.   

    thanks  a813(周) 还有问题:如果client端发数据后就直接关掉socket,而不发“关闭“消息包,我的server 端就只能一直等下去吗?
           
      

  5.   

    Server端send或recv会不成功,getlasterror可以得到出错消息.
      

  6.   

    我还是不懂,我用CSocket类的OnReceive()接收数据,也就是说只有有数据发来时才recv(被动的接受),我怎么能主动的用recv主动的判断呢?
      

  7.   

    见如下SOCKET_ERROR,检查错误,可以知道网络状态void CMyAsyncSocket::OnReceive(int nErrorCode)   // CMyAsyncSocket is 
                                                    // derived from CAsyncSocket
    {
       static int i=0;   i++;   TCHAR buff[4096];
       int nRead;
       nRead = Receive(buff, 4096); 
       
       switch (nRead)
       {
       case 0:
          Close();
          break;
       case SOCKET_ERROR:
          if (GetLastError() != WSAEWOULDBLOCK) 
          {
             AfxMessageBox ("Error occurred");
             Close();
          }
          break;
       default:
          buff[nRead] = 0; //terminate the string
          CString szTemp(buff);
          m_strRecv += szTemp;   // m_strRecv is a CString declared 
                               // in CMyAsyncSocket
          if (szTemp.CompareNoCase("bye") == 0 )    ShutDown();
       }
       CAsyncSocket::OnReceive(nErrorCode);
    }
      

  8.   

    to:a813
    如果对方直接把网线扯下来,你能得到OnReceive消息吗?
      

  9.   

    to:Lighter
    网线扯下,OnSend会出错