ImageVerifierCode 换一换
格式:DOC , 页数:3 ,大小:24.50KB ,
资源ID:3012713      下载积分:20 文钱
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,省得不是一点点
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.wenke99.com/d-3012713.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(心跳函数.doc)为本站会员(11****ws)主动上传,文客久久仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知文客久久(发送邮件至hr@wenke99.com或直接QQ联系客服),我们立即给予删除!

心跳函数.doc

1、偶来凑凑热闹。前些日子,和群里面的兄弟讨论过这个问题,为此,还说了另外的一些话题,比如三次握手,滑动窗口,消息边界,心跳函数之类。如果不清楚的,请补习一下相应的知识吧,这可是底层原理,不清楚,自然不晓得为什么,客户端异常断开,服务器端侦测不到。从根源上说,这是由于 TCP 协议的问题。TCP 协议的初衷是: 网络中断时,仍能维持通信的能力。美国国防部要求能在遭到核打击或其它灾害的时候,仍然能维持计算机之间可靠的网络通知协议。呵呵,如果客户端断开,服务器就马上释放连接。还维持什么?和初衷不符吧。要搞清楚客户端断开,为什么服务器端不能立即侦测到。这个问题,必须要理解三次握手机制。当然服务器也能侦测

2、到异常断开,KEEPALIVE 的默认时间是 2 小时哟。详细的 TCP 三次握手机制:客户端发送一个带 SYN 位的请求,向服务器表示需要连接,假设请求序号号为 SYN = 10, ACK=0服务器接收到这样的请求后,查看是否在 LISTEN 的是指定的端口,不然,就发送 RST=1 应答,拒绝建立连接。 如果接收连接,那么服务器发送确认,SYN 为服务器的一个内码,假设为 100,ACK 位则是客户端的请求序号加 1,本例中发送的数据是:SYN=100,ACK=11,用这样的数据发送给客户端。 客户端发送确认建立连接的消息给服务器。确认信息的 SYN 位是服务器发送的 ACK 位,ACK

3、位是服务器发送的 SYN 位加 1 。如果 TCP 连接第三次握手中,用户向服务器发送了一个 SYN 后就掉线了( 第一步)。服务器发出SYN+ACK 应答报文(第二步) 。然后就再也无法收到客户端的 ACK 报文的。这种情况下,服务器就不断的重试, (再次发送 SYN+ACK 给客户端) ,直到超时。注意:服务器是接收到 SYN 请求就立即与客户端建立连接,而是先为连接请求分配内存空间,建立会话,并放到一个等待队列中。如果,这个等待的队列已经满了,那么,服务器就不在为新的连接分配任何东西,直接丢弃新的请求。这就是服务器的拒绝服务了。 因此,如果有人写一个恶意程序来试试你的 Borland s

4、ocket server,后果实在不敢去想。知道了问题的原因,也就能找出解决办法。解决办法就是用心跳函数。在 TCP 中有一个 Keep-alive 的机制可以检测死连接,原理很简单,TCP 会在空闲了一定时间后发送数据给对方:1.如果主机可达,对方就会响应 ACK 应答,就认为是存活的。2.如果可达,但应用程序退出,对方就发 RST 应答,发送 TCP 撤消连接。3.如果可达,但应用程序崩溃,对方就发 FIN 消息。4.如果对方主机不响应 ack, rst,继续发送直到超时,就撤消连接。这个时间就是默认的二个小时。用 keep_alive 可以检测死连接,并撤消连接。但是是不是我们希望的呢?

5、可能是,可能不是。有时可能我们希望重新通过另一个连接,来实现系统正常运转。keep_alive 实现:type TCP_KeepAlive = record OnOff: Cardinal; KeepAliveTime: Cardinal; KeepAliveInterval: Cardinal end; var Val: TCP_KeepAlive; Ret: DWord; begin Val.OnOff:=1; Val.KeepAliveTime:=xxx; Val.KeepAliveInterval:=xxx; WSAIoctl(AThread.Connection.Socket.Bin

6、ding.Handle, IOC_IN or IOC_VENDOR or 4, Val, SizeOf(Val), nil, 0, Ret, nil, nil) end;心跳函数:客户端定时向服务器发送数据,表示自己存活着。在固定的时间内,服务器没有收到消息,就认为客户端已经断开,并释放连接。而这个过程也可以是双方的。即两边都有心跳机制。Borland socket server 具体代码实现:从派生 TServerClientThread 线程类。THeartBeatServerClientThread= class(TServerClientThread) privatecs : TCri

7、ticalSection; protected.procedure AddClient(vHeartBeat: THeartBeatServerClientThread);procedure RemoveClient(vHeartBeat: THeartBeatServerClientThread);end;WorkThread: Array 0.MaxLink-1 of THeartBeatServerClientThread; /连接队列 procedure THeartBeatServerClientThread.Execute;var theStream : TWinSocketStr

8、eam; begin . theStream := TWinSocketStream.Create(ClientSocket,120000); While (not Terminated) and (ClientSocket.Connected) do begin try if theStream.WaitForData(10) then begin Len := theStream.Read.if Len=0 then begin /客户关闭连接 ClientSocket.Close; end else begin theStream.Write(Buffer,nLen); end; end; except ClientSocket.Close; /Read 和 Write 出错,断开连接。end; end;

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。