读书人

serverSocket 怎样释放失去连接的sock

发布时间: 2012-02-26 20:19:44 作者: rapoo

serverSocket 怎样释放失去连接的socket资源?
我用的是ServerSocket,底层有一些板子做为客户端,客户端每5秒发送一次连接信息,服务端收到则证明连接正常,否则马上关闭这个连接,报警。
现在发现客户端断开之后(突然断电或者板子重启)服务端相应的socket资源并没有释放,而是过了大概3、4分钟的样子才释放掉,怎样能够马上释放资源呢?
我参考的是网上的代码,如下:
......
procedure TForm1.ServerSocketClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
var
i,j:integer;
begin
j:=-1;
for i:=0 to sessions do
begin
//在原有的客户端连接数组中有中断的客户端连接
if not session[i].CUsed then
begin
session[i].CHandle := Socket.SocketHandle ;//客户端套接字句柄
session[i].CSocket := Socket; //客户端套接字
//session[i].CName := Socket.RemoteHost ; //客户端计算机名称
session[i].CAddress := Socket.RemoteAddress ;//客户端计算机IP
session[i].CUsed := True; //连接数组当前位置已经占用
Break;
end;
j:=i;
end;
if j=sessions then
begin
inc(sessions);
session[j].CHandle := Socket.SocketHandle ;
session[j].CSocket := Socket;
//session[j].CName := Socket.RemoteHost ;
session[j].CAddress := Socket.RemoteAddress ;
session[j].CUsed := True;
end;
Memo1.Lines.Add( "客户端 "+Socket.RemoteAddress + " 连接 ");
end;
......
其实就是怎么样释放session[j].CSocket 这个连接的资源

[解决办法]
客户端断开连接自动释放
[解决办法]
按时发送确在线指令,没收到就断开
[解决办法]
closesocket(clientsocket)

[解决办法]
发送心跳包~~~
[解决办法]
socket 本身就是不能马上知道释放

客户端每5秒发送一次连接信息,服务端收到则证明连接正常, 这个就是心跳了

现在你可以加入一个判断, if 3 次没收到连接信息 then 关闭连接

session[nn].CSocket.close就可,里面实际用的也是closesocket,这样socket进入TIME_WAIT状态,也是没完全释放倒是,不过这样的socket已经由系统接管,你程序这边是完全释放了的,想立即关闭tcp连接是不可能的,这个是双向握手决定的
[解决办法]
使用心跳检测啊
[解决办法]
这种断并不会让你的client重启后不能链接,每次链接句柄不一样的,你映射的端口信息也会不一样。
我以前测试,故意拔掉网线然后关闭再启动链接一样可以连上,跟你断电是一样的。
你最好跟踪一下代码,看看有没有进入链接。是否是数据那里判断出问题。
并看看是否有socket的错误码。连不上timeout肯定有的是什么原因。
[解决办法]
如果是windows平台,直接修改TCP/IP的KeepAliveTime的数值. 系统会帮你回收连接.
记住:编程不可能改变你的人生,快点脱离技术吧,早点实现财务自由!

读书人网 >.NET

热点推荐