博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Delphi之TClientSocket和TServerSocket使用tcp keepalive心跳机制实现“断网”、"断电"检测...
阅读量:5173 次
发布时间:2019-06-13

本文共 1646 字,大约阅读时间需要 5 分钟。

 

开发环境:Delphi7

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

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

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

具体实现如下:

TClientSocket和TServerSocket均使用非阻塞模式

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

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

2、引用WinSock,WinSock2

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

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

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

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

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

测试效果图:

 

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

你可能感兴趣的文章
Java Scala获取所有注解的类信息
查看>>
delphi ,安装插件
查看>>
case when then的用法-leetcode交换工资
查看>>
11.28.cookie
查看>>
BeanShell简介
查看>>
python字符串操作
查看>>
不同程序语言的注释和变量要求
查看>>
语言基础(9):static, extern 和 inline
查看>>
ES5_03_Object扩展
查看>>
bzoj 2600: [Ioi2011]ricehub
查看>>
创建数据库,表
查看>>
工厂模式
查看>>
计算机网络基础知识
查看>>
C#里如何遍历枚举所有的项
查看>>
如何在键盘出现时滚动表格,以适应输入框的显示
查看>>
超级强大的鼠标手势工具
查看>>
常用Dockerfile举例
查看>>
jquery的ajax用法
查看>>
设计模式-策略模式(Strategy)
查看>>
django orm 数据查询详解
查看>>