[摘录]网络通信中的心跳机制的实现
来源:互联网 发布:丽水学院网络图书馆 编辑:程序博客网 时间:2024/06/06 02:04
TCP中已经实现了心跳的机制, 如果设置了心跳,那TCP就会在一定的时间(比如设置的是3秒钟)内发送设置的次数的心跳(比如说2次),并且此信息不会影响自定义的协议。
定义心跳常量
const
IOC_IN =$80000000;
IOC_VENDOR =$18000000;
IOC_out =$40000000;
SIO_KEEPALIVE_VALS =IOC_IN or IOC_VENDOR or 4;
IOC_IN =$80000000;
IOC_VENDOR =$18000000;
IOC_out =$40000000;
SIO_KEEPALIVE_VALS =IOC_IN or IOC_VENDOR or 4;
var
inKeepAlive,OutKeepAlive:TTCP_KEEPALIVE;
实现代码是在Acceptsc:= WSAAccept(Listensc, nil, nil, nil, 0) 代码的后面加入:
opt:=1;
if setsockopt(Acceptsc,SOL_SOCKET,SO_KEEPALIVE,@opt,sizeof(opt))=SOCKET_ERROR then
begin
closesocket(Acceptsc);
end;
inKeepAlive.onoff:=1;
//设置3秒钟时间间隔
if setsockopt(Acceptsc,SOL_SOCKET,SO_KEEPALIVE,@opt,sizeof(opt))=SOCKET_ERROR then
begin
closesocket(Acceptsc);
end;
inKeepAlive.onoff:=1;
//设置3秒钟时间间隔
inKeepAlive.keepalivetime:=3000;
//设置每3秒中发送1次的心跳
inKeepAlive.keepaliveinterval:=1;
insize:=sizeof(TTCP_KEEPALIVE);
outsize:=sizeof(TTCP_KEEPALIVE);
if WSAIoctl(Accept,SIO_KEEPALIVE_VALS,@inKeepAlive,insize,@outKeepAlive,outsize,@outByte,nil,nil)=SOCKET_ERROR then
begin
closesocket(Acceptsc);
end;
inKeepAlive.keepaliveinterval:=1;
insize:=sizeof(TTCP_KEEPALIVE);
outsize:=sizeof(TTCP_KEEPALIVE);
if WSAIoctl(Accept,SIO_KEEPALIVE_VALS,@inKeepAlive,insize,@outKeepAlive,outsize,@outByte,nil,nil)=SOCKET_ERROR then
begin
closesocket(Acceptsc);
end;
如果加入以上的代码以后,系统会每3秒中加入一次的心跳。并且如果客户端断线以后(网线断),函数GetQueuedCompletionStatus会返回FALSE。
if (GetQueuedCompletionStatus(CompletionPort, BytesTransferred,DWORD(PerHandleData), POverlapped(PerIoData), INFINITE) = False) then
begin
//在这里处理客户端断线信息。
begin
//在这里处理客户端断线信息。
continue;
end;
end;
以上就是使用心跳的方法.
- [摘录]网络通信中的心跳机制的实现
- 网络通信中的心跳机制的实现
- 网络通信中的心跳机制的实现
- 网络通信中的心跳机制的实现!
- 基于Windows Socket 的网络通信中的心跳机制原理
- 基于Windows Socket 的网络通信中的心跳机制原理
- LINUX C网络编程中的心跳机制
- LINUX C网络编程中的心跳机制
- LINUX C网络编程中的心跳机制
- 心跳包机制及Socket通信服务的心跳包
- 心跳包机制及Socket通信服务的心跳包
- 心跳包机制及Socket通信服务的心跳包
- 心跳包机制及Socket通信服务的心跳包
- 心跳包机制及Socket通信服务的心跳包
- 心跳包机制及Socket通信服务的心跳包
- 心跳包机制及Socket通信服务的心跳包
- Python网络编程:实现心跳机制
- 网络之心跳机制
- 解析char *p与char p[] 区别
- 第一条
- 怎样才能做好软件技术经理?
- [摘录]IOCP从创建、初始化、接收和发送过程
- java学习网
- [摘录]网络通信中的心跳机制的实现
- .net-c# 获取机器码
- 群发带附件的VBA程序
- 数字金额转为大写金额(C#)
- 局域网其他电脑访问本机iis网站的设置
- DVD subtitle stream in SDL(thinkvd开发日志)
- rtp协议中的时间戳和序列号的差别
- C#中把货币、日期转换成中文大写
- FckEditor V2.6 fckconfig.js中文注释