Delphi之TClientSocket和TServerSocket使用tcp keepalive心跳机制实现“断网”、"断电"检测


本文整理自网络,侵删。

 
开发环境: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;
经测试,采用以上方法,可以检测到把网线断网情况

测试demo下载:

测试效果图:


来源:https://www.cnblogs.com/tc310/p/10886086.html

相关阅读 >>

Delphi xe取得硬盘序列号代码 复制代码

Delphi 屏幕截图完美解决方案

Delphi 时间年月日,星期

Delphi 在线程中运行窗体

Delphi基于高斯-拉普拉斯算子的图像边缘检测

Delphi 获取文件大小根据显示gb mb kb b

Delphi twebbrowser 响应回车键(ewb响应正常,无需额外代码)

Delphi trestclient + trestrequest + trestresponse

Delphi xe5调用外部扫描程序――谷歌 zxing

Delphi idpop3收邮件

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...