• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

delphi中socket心跳包的实现

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

------转自 http://apps.hi.baidu.com/share/detail/33014978

有开发网络应用经历的人都知道,网络中的接收和发送数据都是使用WINDOWS中的SOCKET进行实现。但是如果此套接字已经断开,那发送数据和接收数据的时候就一定会有问题。可是如何判断这个套接字是否还可以使用呢? 

  有人一定想到使用Send函数中的返回结果来进行判断。如果返回的长度和自己发送出去的长度一致,那就说明这个套接字是可用的,否则此套接字一定出现了问题。但是我们并不是无时无刻的发送数据呀。如何解决呢? 

  其实TCP中已经为我们实现了一个叫做心跳的机制。如果你设置了心跳,那TCP就会在一定的时间(比如你设置的是3秒钟)内发送你设置的次数的心跳(比如说2次),并且此信息不会影响你自己定义的协议。 

  在VC中实现心跳的例子很多,可是在DELPHI中一直没有相应的代码。下面我是我使用DELPHI编写的关于心跳的代码(以IOCP为例),希望对大家有帮助。 



定义心跳常量 

const 
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秒钟时间间隔 

  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; 

如果加入以上的代码以后,系统会每3秒中加入一次的心跳。并且如果客户端断线以后(网线断),函数GetQueuedCompletionStatus会返回FALSE。 

if (GetQueuedCompletionStatus(CompletionPort, BytesTransferred,DWORD(PerHandleData), POverlapped(PerIoData), INFINITE) = False) then 
begin 
//在这里处理客户端断线信息。 

   continue; 
end; 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
delphiXE2-新的里程碑发布时间:2022-07-18
下一篇:
Delphi跨进程访问DBGRID发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap