Delphi之TClientSocket和TServerSocket使用tcp keepalive心跳机制实现“断网”、断电检测...
开发环境: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心跳机制实现“断网”、断电检测...相关推荐
- TCP连接探测中的Keepalive和心跳包. 关键字: tcp keepalive, 心跳, 保活
1. TCP保活的必要性 1) 很多防火墙等对于空闲socket自动关闭 2) 对于非正常断开, 服务器并不能检测到. 为了回收资源, 必须提供一种检测机制. 2. 导致TCP断连的因素 如果网络正常 ...
- linux tcp在传输数据的时候断网了_选择最合适的协议 让传输数据更灵敏
随着数据的爆发式增长以及移动互联网的快速演进,存储并处理海量数据正成为企业业务增长和保持竞争力的关键因素.为满足高性能存储的高速传输需求,英特尔最新推出了Ethernet 800系列网络适配器,该产品 ...
- 从一起丢包故障来谈谈 nginx 中的 tcp keep-alive
一.故障 基本架构如图所示,客户端发起 http 请求给 nginx,nginx 转发请求给网关,网关再转发请求到后端微服务. 故障现象是,每隔十几分钟或者几个小时不等,客户端就会得到一个或者连续多个 ...
- TCP keepAlive详解(TCP心跳包)
TCP keepAlive含义: 在TCP中有一个Keep-alive的机制可以检测死连接,原理很简单,TCP会在空闲了一定时间后发送数据给对方: 1.如果主机可达,对方就会响应ACK应答,就认为是存 ...
- linux tcp keepalive,[20170504]Linux TCP keepalive timers.txt
[20170504]Linux TCP keepalive timers.txt --//上午仔细看一些文档,发现实际上netstat命令就有输出,参数--timer或者-o参数. # netstat ...
- golang tcp keepalive实践
前文中已经介绍了TCP keep alive的做了详尽说明,本文结合golang,介绍如何使用TCP keep alive. 目前golang net包不提供TCP keep alive 空闲多长时间 ...
- TCP keepalive的详解(解惑)
TCP是面向连接的,一般情况,两端的应用程序可以通过发送和接收数据得知对端的存活. 当两端的应用程序都没有数据发送和接收时,如何判断连接是否正常呢? 这就是SO_KEEPALIVE的作用. 1. SO ...
- Tcp Keepalive和HTTP Keepalive详解
转载:https://www.cnblogs.com/hukey/p/5481173.html TCP Keepalive Tcp Keepalive的起源 双方建立交互的连接,但是并不是一直存在数据 ...
- tcp keepalive
部分信息可以看UNIX网络编程第157页, 摘录过来: 在一个正常的TCP连接上,当我们用无限等待的方式调用下面的Recv或Send的时候: ret=recv(s,&buf[idx],nLef ...
- php tcp keepcnt,故障处理---TCP KeepAlive
实际生产环境中,不时会有网络连接异常中断导致应用功能异常的问题出现.这往往是因为TCP连接长期空闲,超过防火墙允许的超时时间所致,使用TCP KeepAlive是解决问题的方法之一,主要有两部分工作: ...
最新文章
- OSChina 周六乱弹 —— 中国历史上路子最野的人
- 使用svnsync备份详解[转载+修改]
- C++ 正态分布、概率累积密度函数的使用(boost库)
- IDEA中使用Maven构建SSM项目
- apache 配置文件内使用 8080 端口_【SpringBoot 框架】- SpringBoot 配置文件
- PCA主成分分析+SVM实现人脸识别
- java中,在一个有序数组中插入元素,使得数组保持有序排列
- 【个人网站搭建教程】阿里云服务器+宝塔+wordpress
- 从 0 到 1000+ 台服务器监控的构建之路
- 非常可乐(广度搜索)
- 计算机网络—数据链路层 网络层 传输层 应用层
- win10虚拟机连接不上内网服务器,win10系统虚拟机无法连接网络的解决方法
- token干什么用_token是什么意思,token身份验证使用方法流程
- OpenCV 实现读取摄像头、视频读取保存 (C++)
- 通信室计算机室采购配置co2灭火器,2019一级消防案例分析考点:民用类建筑消防设施的配置...
- 前端Hack之XSS攻击个人学习笔记
- 计算机科学方向的会议或期刊,计算机顶会和顶刊_计算机顶会_顶会
- java优先队列 PriorityQueue详解(附图)
- frl啥意思_手表日历显示frl是什么意思
- Criteria用法的小结
热门文章
- 第九章 (一)动态规划
- springboot的学习笔记,这个很重要
- 在maven中做ssm整合
- 144hz和60hz测试软件,144hz显示器与60hz采集卡(等同于60hz显示器)复制画面后程序帧率异常...
- mysqld是服务,mysql是客户端
- Linux中的重定向
- java冒泡排序菜鸟教程_排序算法总结 | 菜鸟教程
- 阶段5 3.微服务项目【学成在线】_day03 CMS页面管理开发_09-修改页面-服务端-接口开发...
- Django 学习笔记(五) --- Ajax 传输数据
- python实现 双向循环链表