当前位置:  技术问答>linux和unix

关于发送心跳包检测TCP连接是否断开

    来源: 互联网  发布时间:2016-03-15

    本文导语:  看了很多资料, 都说客户端如果要查看自己是否已经因为某种原因已经和服务器端断开的话, 一个办法是定期给服务器发送一些数据以检查连接是否正常, 我做了一些试验, 有一些疑惑, 希望大家帮忙答疑.  send即使...

看了很多资料, 都说客户端如果要查看自己是否已经因为某种原因已经和服务器端断开的话, 一个办法是定期给服务器发送一些数据以检查连接是否正常,
我做了一些试验, 有一些疑惑, 希望大家帮忙答疑.
 send即使是连接断开(比如拔掉网线)后的刚开始,  发送的返回值也是>0的, 正常的. 这可能是因为send只是往发送缓冲区拷贝数据, 刚开始缓冲区还未满,所以不会有错误发生, 只有等到相当一段长的时间后, send的返回值才会为-1, 但是这个时候我用ret = getsockopt(s,SOL_SOCKET,SO_ERROR,&error_code,&optlen); , 居然始终是ret=0, error_code也是0, 也就是没有错误发生.
那么我的问题有两个:
1. 如果发送心跳包, 时间间隔长一点,那么send要相当一段时间才有错误返回, 如果太端(毫秒级别), 错误返回很快, 但这样会给自己造成负担, 同时搞不好会被服务器认为是攻击, 怎么取舍?
2. 为什么拔掉网线后, send也返回-1了, getsockopt还是拿不到错误代码? 怎么解释?

谢谢

|
1. 如果发送心跳包, 时间间隔长一点,那么send要相当一段时间才有错误返回, 如果太端(毫秒级别), 错误返回很快, 但这样会给自己造成负担, 同时搞不好会被服务器认为是攻击, 怎么取舍? 


选择一个大家都可以接受的时间间隔就可以了。

同时搞不好会被服务器认为是攻击: 判断2个心跳包之间的间隔可以解决这个问题,2个包之间的间隔比自己定义的短可以认为是非法连接。

|
你为什么要等ret = getsockopt(s,SOL_SOCKET,SO_ERROR,&error_code,&optlen); 
应该是,你发送数据包后,就等待接收端应答数据包,如果在指定的时间内没有收到,则再重发,如此三次,还没有响应,则视为断开了.还有你把连接改成异步的方式,这样,就不用等待函数返回了.

|
1. 使用非阻塞的socket通信。通信双方实现交互,发送完心跳包之后等待对方的一个响应,如果在一个超时时间内没有数据响应,则认为是出错了。

2. 个人见解,仅供参考:getsockopt获取的应该是通信协议层的得错误码,而send返回的是系统调用的错误吗,你拔掉网线后协议层根本就无法进行交互了,所以无法获取socket的状态。内核中的socket对象的超时时间是很长的,在这个超时时间中,你把网线重新插回去,数据还是可以发送出去的,因此你用getsockopt无法获取错误吗应该也是正常的,你多等一会,等缓冲区中的发送超时之后,你这时调用getsockopt应该就可以获取到错误码了。

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 用Delphi或VC怎么向unix发送命令来检测进程甚至能够控制进程?
  • 怎样监测我的机器通过网卡都发送了什么东西?而不是像sniffer等检测收到了什么东西?
  • HTTP协议发送请求详解
  • 我想让内核向网卡发送数据时,不是立即发送,而是等我允许时再发送
  • TCP发送数据,假如发送套接口是非阻塞的,而要发送的数据大于缓冲区尺寸
  • socket发送端、接收端同一机器,kill掉接收端进程,发送端也被kill?
  • *** 高分, 请问如何发送一个事件, 比如发送一个Tab键? ***
  • 谁知道minicom监控VT100终端时候发送"F1"键是发送的什么转义字符呢?
  • 有没有谁实现了向IE浏览器那种“发送网页(P)”,把完整html格式发送给相应email?
  • 用sendto(socket, buf, strlen(buf), ...)发送一个包,如何得到发送的源地址(也就是本机的源地址)
  • postfix 在内网可以正常接收与发送邮件,但向局外,不能接收与发送
  • 串口应用程序,当对方发送大量的数据时,本方的数据无法发出。对方停止发送,本方的数据仍然无法发出。不知道是什么原因。
  • sendmail,内部发送接收可以,当用外部的域名,无法发送和接收,如163账号。
  • 如何将数据库里边的长度超过65535的数据打包发送发送?
  • 同多个线程通过同一个socket发送数据,操作系统底层会同步每个发送操作吗
  • 求助,udp文件传输发送端发送完了,接收端却接受到一半就bad address?
  • 通过短信发送LOG归类号码发送情况的shell脚本
  • 怎么用sendmail发送纯文本邮件,无论中英文都可显示,但如改用发送html格式的邮件,即message.setContent("Hello,this is content,后面
  • 数据包通过dev_queue_xmit发送出去,dev_queue_xmit返回值为0,但是对方收不到数据包 ,本机也抓不到发送出去的包
  • 请问在netfilter的forward点上怎么将原来从eth0发送的数据包转向由eth1发送啊?
  • 我调用socket向外发送消息,为什么在发送的同时,会打印字符串到屏幕上
  • 怎样编程发送广播包?我的这段程序发送怎么返回值总是-1?
  • 使用perl发送带有附件的电子邮件是什么原理呀?不带附件得我已经发送成功了,希望指点


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    jquery iis7站长之家