[转]Delphi2010中DataSnap高级技术(4)—TCP keepAlive和KeepAliveInterval参数详解


======================================================
注:本文源代码点此下载
======================================================

delphi2010中datasnap,如果客户端异常掉线或拔掉网线,那么在服务端会留下一个tcp连接,这个连接会变成死连接(经过测试,如果windows的tcp保持连接禁用的话,三个小时该死连接还不消失)。如果大量客户端并发,出现的死tcp连接过多,服务器内存和端口将会增加,直到占满服务器的端口和耗尽内存为止。如果这样的话,服务器无法健壮稳定的运行。

大家可以另开线程来监控客户端连接,但是今天要给大家讲解的不是这个方法,而是使用tcp协议自带的心跳包功能解决这个问题。

大家先了解一下 tcp keep-alive原理

一个tcp keep-alive 包是一个简单的ack,该ack包内容为一个比当前连接sequence number 小于一的包。主机接受到这些acks会返

回一个包含当前sequence number 的ack包。

keep-alives一般被用来验证远端连接是否有效。如果该连接上没有其他数据被传输,或者更高level 的 keep-alives被传送,keep-alives 在每个keepalivetime被发送。(默认是 7,200,000 milliseconds ,也就是2个小时)。

如果没有收到 keep-alive 应答,keep-alive 将在每 keepaliveinterval 秒重发一次。keepaliveinterval 默认为1秒。如 microsoft 网络功能中很多部分中采用的 netbt 连接,更常见的是发送 netbios keep-alives,所以,在 netbios 连接中通常不发送tcp keep-alives。

tcp保持连接默认被禁用,但是微软sockets应用程序可以使用setsockopt函数去启用他们。

请看下面的类

type

tcp_keepalive = record

onoff: cardinal;

keepalivetime: cardinal; // 多长时间(ms)没有数据就开始send心跳包

keepaliveinterval: cardinal // 每隔多长时间(ms)send一个心跳包,发5次(系统值)

end;

keepalivetime: tcp连接多长时间(毫秒)没有数据就开始发送心跳包,有数据传递的时候不发送心跳包

keepaliveinterval: 每隔多长时间(毫秒)发送一个心跳包,发5次(系统默认值)

如果客户端网络中断,服务器系统发送心跳包后,服务器会自动解除tcp连接。这一点,大家可以使用 netstat -p -tcp 命令查看

接下来我们将结合delphi2010 datasnap技术使用心跳包功能!敬请关注

本文来自csdn博客,转载请标明出处:http://blog.csdn.net/sunstone/archive/2009/12/16/5016363.aspx


======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值