我查了下,win下掉了,recv很快就会返回,这时知道掉线。
但linux下,如果拨了网线recv不返回,send也是成功。
直到缓冲区满了,才知道掉线了,,,但这么久才知道掉线,那sndbuf的数据就丢了,,,

解决方案 »

  1.   

    ping吧
    按照你认为掉线的时长
      

  2.   

    有心跳包,你发送一个心跳请求,如果send成功,那么在指定时间内,你就收到心跳应答,如果没收到,你就认为掉了呗
      

  3.   

    楼主已经知道心跳处理机制了,已经说了是别人的服务器不提供心跳包的回复,楼上的根本不仔细看楼主的问题啊。好长时间不做socket了,我记得recv函数好像是在断开时会返回“-1”吧!楼主可以式式,一般来说都是使用一个接收线程循环的调用recv函数,等待连接方send时发送数据。楼主可以式一下,我记得好像是有这么回事,当断开了recv直接返回“-1”或你看看会不会有传回,应该就会结束当次的阻塞。
      

  4.   

    楼主看一下MSDN的recv函数,在re那部分中最后面有一个表格,其中:
    MSG_WAITALL The receive request will complete only when one of the following events occurs:The buffer supplied by the caller is completely full. 
    The connection has been closed. 好像是连接断开了就返回这个值MSG_WAITALL 
    The request has been canceled. 
    Note that if the underlying transport does not support MSG_WAITALL, or if the socket is in a non-blocking mode, then this call will fail with WSAEOPNOTSUPP. Also, if MSG_WAITALL is specified along with MSG_OOB, MSG_PEEK, or MSG_PARTIAL, then this call will fail with WSAEOPNOTSUPP. This flag is not supported on datagram sockets or message-oriented CO sockets. 
      

  5.   


    谢谢你认真看了我的问题!你说socket断开时recv返回-1,在win下是这样的,我也是那么处理,很可靠。
    但是linux下不管用了,也就是说非正断开连接后,recv不返回!
      

  6.   

    心跳也快不到哪里去。似乎应该用更底层的api
      

  7.   


    谢谢你认真看了我的问题!你说socket断开时recv返回-1,在win下是这样的,我也是那么处理,很可靠。
    但是linux下不管用了,也就是说非正断开连接后,recv不返回!
    跟开发服务器方协商一些,定制心跳包检测机制
      

  8.   

    网络这种东西,靠什么“底层api”?  只有beep包检测,是唯一可靠的办法。
      

  9.   

    发送心跳包看看能不能在指定时间收到回复,可以使用几个MSL来判断。
      

  10.   

    recv不返回是阻塞了,linux都是阻塞模式吗?linux我不熟。windows是可以设置的。
      

  11.   

    tcp是无状态的协议,若想知道连接状态,必须自己想办法。(如心跳包)在一条TCP连接中,心跳包通常是单向的。双方还要定好心跳周期。
    对于发送方,如果心跳发不出去,说明连接断了;
    对于接收方,如果在一个周期(通常大于一个周期)内还没收到心跳,说明连接断了;
      

  12.   

    WIN下使用套接字方式时,网络断开的返回时间在不同的状态也会不同。
    1、当本机网线断开时,客户端会立即收到OnClose事件
    2、当网络正常连接在交换机上,而服务端异常断开,OnClose事件会延迟发生
    正常断开,nErrorCode 返回0,非正常断开时,返回一个错误代码-1。
    TCP在连接建立后底层有一个“心跳”,如果你直接监视TCP的心跳包,可能知道与服务端的连接状态,但可能涉及到低级编程我也未做过。
      

  13.   

    如果对方服务器没有心跳包的支持,那么你只能利用发icmp包来检测了,创建一个原始套接字(不是tcp也不是udp)
    更多信息请参看:
    http://www.itye.org/archives/1282