开发环境:Delphi7

测试环境:WinXP,Win7  32bit,Win7 64bit

使用TClientSocket和TServerSocket实现TCP长连接通讯,经常因为断电断网等原因导致出现一些死连接。

解决方法是客户端和服务端都定时发送心跳包。

具体实现如下:

TClientSocket和TServerSocket均使用非阻塞模式

1、定义心跳常量和KeepAlive 数据结构

//定义心跳常量
ConstIOC_IN = $80000000;IOC_VENDOR = $18000000;IOC_out = $40000000;SIO_KEEPALIVE_VALS = IOC_IN or IOC_VENDOR or 4;DATA_BUFSIZE = 8192;//定义 KeepAlive 数据结构
TypeTTCP_KEEPALIVE = packed recordonoff: integer;keepalivetime: integer;keepaliveinterval: integer;end;

2、引用WinSock,WinSock2

3、写一个方法来使用setsockopt,WSAIoctl设置心跳包参数

procedure TForm1.setKeepAlive(Socket: TCustomWinSocket);
varopt:Integer;klive, outKlive: TTCP_KEEPALIVE;i,j:integer;OptVal: DWORD;
beginopt := 1;//需引用WinSock.pasif setsockopt(Socket.SocketHandle,SOL_SOCKET, SO_KEEPALIVE, PAnsiChar(@opt), SizeOf(opt)) = SOCKET_ERROR thenbeginshowInfo(Format('WinSock Error %d', [WSAGetLastError()]));end;klive.onoff := 1;klive.keepalivetime := 5000;klive.keepaliveinterval := 1;//需引用WinSock2.pasif WSAIoctl(Socket.SocketHandle, SIO_KEEPALIVE_VALS, PAnsiChar(@klive),SizeOf(TTCP_KEEPALIVE), PAnsiChar(@outKlive),SizeOf(TTCP_KEEPALIVE), @opt,0,nil) = SOCKET_ERROR thenbeginshowInfo(Format('WinSock Error %d', [WSAGetLastError()]));end;end;

4、在TClientSocket和TServerSocket的连接事件中调用设置心跳

procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;Socket: TCustomWinSocket);
beginshowInfo('ServerSocket1ClientConnect-' + Socket.RemoteAddress + ':' + IntToStr(Socket.RemotePort));setKeepAlive(Socket); //设置socket心跳,以便清除死链接
end;

经测试,采用以上方法,可以检测到把网线断网情况

测试demo下载:

测试效果图:

转载于:https://www.cnblogs.com/tc310/p/10886086.html

Delphi之TClientSocket和TServerSocket使用tcp keepalive心跳机制实现“断网”、断电检测...相关推荐

  1. TCP连接探测中的Keepalive和心跳包. 关键字: tcp keepalive, 心跳, 保活

    1. TCP保活的必要性 1) 很多防火墙等对于空闲socket自动关闭 2) 对于非正常断开, 服务器并不能检测到. 为了回收资源, 必须提供一种检测机制. 2. 导致TCP断连的因素 如果网络正常 ...

  2. linux tcp在传输数据的时候断网了_选择最合适的协议 让传输数据更灵敏

    随着数据的爆发式增长以及移动互联网的快速演进,存储并处理海量数据正成为企业业务增长和保持竞争力的关键因素.为满足高性能存储的高速传输需求,英特尔最新推出了Ethernet 800系列网络适配器,该产品 ...

  3. 从一起丢包故障来谈谈 nginx 中的 tcp keep-alive

    一.故障 基本架构如图所示,客户端发起 http 请求给 nginx,nginx 转发请求给网关,网关再转发请求到后端微服务. 故障现象是,每隔十几分钟或者几个小时不等,客户端就会得到一个或者连续多个 ...

  4. TCP keepAlive详解(TCP心跳包)

    TCP keepAlive含义: 在TCP中有一个Keep-alive的机制可以检测死连接,原理很简单,TCP会在空闲了一定时间后发送数据给对方: 1.如果主机可达,对方就会响应ACK应答,就认为是存 ...

  5. linux tcp keepalive,[20170504]Linux TCP keepalive timers.txt

    [20170504]Linux TCP keepalive timers.txt --//上午仔细看一些文档,发现实际上netstat命令就有输出,参数--timer或者-o参数. # netstat ...

  6. golang tcp keepalive实践

    前文中已经介绍了TCP keep alive的做了详尽说明,本文结合golang,介绍如何使用TCP keep alive. 目前golang net包不提供TCP keep alive 空闲多长时间 ...

  7. TCP keepalive的详解(解惑)

    TCP是面向连接的,一般情况,两端的应用程序可以通过发送和接收数据得知对端的存活. 当两端的应用程序都没有数据发送和接收时,如何判断连接是否正常呢? 这就是SO_KEEPALIVE的作用. 1. SO ...

  8. Tcp Keepalive和HTTP Keepalive详解

    转载:https://www.cnblogs.com/hukey/p/5481173.html TCP Keepalive Tcp Keepalive的起源 双方建立交互的连接,但是并不是一直存在数据 ...

  9. tcp keepalive

    部分信息可以看UNIX网络编程第157页, 摘录过来: 在一个正常的TCP连接上,当我们用无限等待的方式调用下面的Recv或Send的时候: ret=recv(s,&buf[idx],nLef ...

  10. php tcp keepcnt,故障处理---TCP KeepAlive

    实际生产环境中,不时会有网络连接异常中断导致应用功能异常的问题出现.这往往是因为TCP连接长期空闲,超过防火墙允许的超时时间所致,使用TCP KeepAlive是解决问题的方法之一,主要有两部分工作: ...

最新文章

  1. OSChina 周六乱弹 —— 中国历史上路子最野的人
  2. 使用svnsync备份详解[转载+修改]
  3. C++ 正态分布、概率累积密度函数的使用(boost库)
  4. IDEA中使用Maven构建SSM项目
  5. apache 配置文件内使用 8080 端口_【SpringBoot 框架】- SpringBoot 配置文件
  6. PCA主成分分析+SVM实现人脸识别
  7. java中,在一个有序数组中插入元素,使得数组保持有序排列
  8. 【个人网站搭建教程】阿里云服务器+宝塔+wordpress
  9. 从 0 到 1000+ 台服务器监控的构建之路
  10. 非常可乐(广度搜索)
  11. 计算机网络—数据链路层 网络层 传输层 应用层
  12. win10虚拟机连接不上内网服务器,win10系统虚拟机无法连接网络的解决方法
  13. token干什么用_token是什么意思,token身份验证使用方法流程
  14. OpenCV 实现读取摄像头、视频读取保存 (C++)
  15. 通信室计算机室采购配置co2灭火器,2019一级消防案例分析考点:民用类建筑消防设施的配置...
  16. 前端Hack之XSS攻击个人学习笔记
  17. 计算机科学方向的会议或期刊,计算机顶会和顶刊_计算机顶会_顶会
  18. java优先队列 PriorityQueue详解(附图)
  19. frl啥意思_手表日历显示frl是什么意思
  20. Criteria用法的小结

热门文章

  1. 第九章 (一)动态规划
  2. springboot的学习笔记,这个很重要
  3. 在maven中做ssm整合
  4. 144hz和60hz测试软件,144hz显示器与60hz采集卡(等同于60hz显示器)复制画面后程序帧率异常...
  5. mysqld是服务,mysql是客户端
  6. Linux中的重定向
  7. java冒泡排序菜鸟教程_排序算法总结 | 菜鸟教程
  8. 阶段5 3.微服务项目【学成在线】_day03 CMS页面管理开发_09-修改页面-服务端-接口开发...
  9. Django 学习笔记(五) --- Ajax 传输数据
  10. python实现 双向循环链表