最近在做一个CS项目,需要用到心跳包去检测网络断开等问题
我使用了TCP自带的KEEPALIVE机制,也设置了间隔时间和重发时间
服务器也能检测到网络断开(使用recv阻塞返回-1及WSAGetLastError取得)
我不敢用select,因为我发现select可以检测到FIN包,所以我估计也能检测到对方自动回复的心跳包应答。
目前有个问题,如果用RECV阻塞,是否能够接收到对端返回的心跳应答??
如果能收到那咋整啊?
如果收不到就好办了!!
在线等  谢谢啊  !

解决方案 »

  1.   

    当然是非阻塞了
    用select、send、recv等函数,返回值为0或-1时,查看错误值
      

  2.   

    你好,我想知道select对于心跳包是否能否检测到可读?
    因为我发现对端使用closesocket发送FIN包时,本端select可以检测到,并且使用recv得到返回值是0
    recv这个返回值应该意思是FIN包的数据部分是空的
    我猜对端的心跳回复应该也能select收到,那处理起来就麻烦了
    recv返回是0不能确定是什么情况 啊  
      

  3.   

    我以为你嵌入式什么的呢,我很好奇,LZ的fin包是什么情况下受到的
    因为我曾经记得好像哪本书上还是什么上曾提过一般是读得那端closesocket或者shutdown才收到fin包的吧?
      

  4.   


    select返回值没有关于keepalive的 
    recv send有 我不知道自己看法对不对:
        select就是用来检测链路上的所有包,包括FIN包,心跳包,各种空包及数据包,只要有就返回,然后用recv(我总觉得recv在select下阻塞与非阻塞没啥区别,因为select返回正常的话就表明有读或写,RECV阻塞函数也不会阻塞,就是觉得加了select 就不用设置阻塞了) recv取的是报文的数据部分,FIN包就是空包,心跳包应该也是这个时候怎么区分来的是心跳应答还是FIN包呢??
      

  5.   


    我是最近在看计算机网络,TCP结束的时候会进行两次握手 分别断开两个方向的链路连接
    如果要结束时,一端发送空包,包头FIN置1;一端接收到FIN包后,回复ACK也就是说我调用select检测链路的可读性的时候,对端发送的FIN包我这面受到了,并RECV后是0.
      

  6.   


    你好 我想了解的是:
         本端select能够检测到心跳ACK包吗?如果本端发送心跳包
         本端select能够检测到心跳包吗?如果对端发送心跳包
      

  7.   


    本端select能够检测到心跳ACK包吗?如果本端发送心跳包
      本端select能够检测到心跳包吗?如果对端发送心跳包
      

  8.   

    自己发送一个心跳的检测消息。如果在规定时间内没有收到返回,就认为断线。TCP的心跳检测有点反正不是太灵敏。