首页  编辑  

拔掉网线,服务器如何检测到?

Tags: /超级猛料/Network.网络通讯/Sockt编程/   Date Created:
拔掉网线,服务器如何检测到?
Idtcpclient连接到IdTcpserver之后,拔掉网线,服务器如何检测到?
试过thread.connection.CheckForGracefulDisconnect和CheckForDisconnect,竟然都认为该客户连接正常。
不采用客户端定时报告信息的方式,还有别的检测手段吗?
来自:LeeChange, 时间:2004-6-9 11:00:30, ID:2653438
心里没底,怕WinSock 1不支持,你最好还是用类似下面的片段吧。
uses WinSock2;
procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
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.Binding.Handle, IOC_IN or IOC_VENDOR or 4,
   @Val, SizeOf(Val), nil, 0, @Ret, nil, nil)
end;  
TCP_KeepAlive里的参数的意义是显而易见的,就不多说了。
然后连接将自动按指定间隔测试是否正常,作为应用程序可以在TCPServer的OnException里守着就行了。  
KeepAliveTime
该值控制了 TCP 尝试通过发送 KeepAlive 数据包确认空闲连接是否依然毫无变化的频率。如果远程计算机仍可访问,说明数据包保持有效 (KeepAlive)。
在默认情况下,系统不发送 KeepAlive 数据包。您可通过程序在连接中配置该值。如果减少至 5 分钟(默认值是 2 小时),表示非活动会话将很快断开。
能连接网络应用程序的攻击者可以通过建立大量的连接造
[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\VxD\MSTCP\Parameters]
"KeepAliveTime"=dword:006ddd00
"KeepAliveInterval"=dword:000003e8
"MaxDataRetries"="5"
--------------------------------------------------------------------------
KeepAliveTime缺省7200000毫秒(ms),也就是两小时。KeepAliveInterval缺省1000
毫秒,也就是1秒。MaxDataRetries缺省5次。