我用的是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 这个连接的资源
现在发现客户端断开之后(突然断电或者板子重启)服务端相应的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 这个连接的资源
采用数组,释放socket可以调用TCustomWinSocket.Close,数组资源回收可以采用SetLength函数可重新分配动态数组长度。