将网线断开后recv始终不返回!用netstat 命令看网络状态,显示这个端口还是连接的!
   奇怪!
   请高手指点!

解决方案 »

  1.   

    不能设置超时,因为服务器要等待客户端发送的请求命令,但不知道客户端将在什么时候发送请求命令,所以我采用阻塞状态。
    网落断开,TCP/IP协议不是知道吗?为什么将网线断开后recv始终不返回呢?
      

  2.   

    keeplive time.或者先send,就会出错.
      

  3.   

    TO:sharkhuang(爱情和程序都读不懂) 
       呵呵,不明白你的意思,能说详细一点吗?
      

  4.   

    我也遇到了同样的问题:
      当客户端断开,经历FIN_WAIT_1->(大约两分钟)然后自己断开连接;
      当服务器断开,将关闭所有的连接上的连接,但listen()继续;
    我采取超时来处理,即客户端定时向服务器发送查询消息,如果双放
    有一方OnTimeOut()说明网线端开!
      

  5.   

    除了网络断开,还有别的情况recv或send不返回的吗?大家有遇到过吗?
      

  6.   

    网络连接断开可以分为两种:1.正常断开.
    这类问题可以处理.2.非正常断开.
    a. 客户端主机突然停电、被损坏、网线被剪断,这是一类;
    b. 客户端进程被结束任务程序强行中止, 此时物理连接是完好的.对于非正常断开, TCP/IP 协议不能检测, 这是 TCP/IP 的设计问题, 只能通过发送数据包来检测.
    如 HeartBeat 包. 只要包不能正常发送出去, 不管是基于上述何种原因, 都可以认为网络已经断开.在你的程序中加入两对 Socket ,其中一对用来发送 HeartBeat 包,每隔单位时间发送一次.
    出错则认为网络已经断开.对于非正常断开, 两对 SOCKET 必然同时断开,这样就可以处理非正常断开了
      

  7.   

    TCP/IP中,断开连接后,需要通过保活定时器来判断
      

  8.   

    很简单,设置SO_RCVTIMEO就行,你想阻塞多久就阻塞多久,或者改异步,注册FD_CLOSE
      

  9.   

    tcp其实是可以检测到socket断开的,只是时间比较长而已,