在clientsocket中设定以端口9999连接服务端,但程序退出时端口没释放,如何解决(200分)

  • 主题发起人 主题发起人 新兵
  • 开始时间 开始时间

新兵

Unregistered / Unconfirmed
GUEST, unregistred user!
在clientsocket中设定以端口9999连接服务端,但程序异常出错后或退出后端口没释放,只有等几分钟后由系统释放,如何解决
程序代码如下
procedure TForm1.ClientSocket1Lookup(Sender: TObject;//////绑定端口9999
Socket: TCustomWinSocket);
var
SockAddrIn: TSockAddrIn;
iRc:Integer;
begin
SockAddrIn.sin_family := AF_INET;
SockAddrIn.sin_addr.S_addr := 0;
SockAddrIn.sin_port := htons(9999);
iRc:=bind(ClientSocket1.Socket.SocketHandle, SockAddrIn, sizeof(TSockAddrIn));
if iRc= 0 then
self.StatusBar1.Panels.Items[0].Text := '绑定成功'
else
self.StatusBar1.Panels.Items[0].Text := Format('%d',[WSAGetLastError()]);
end;
procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);///////////////出错
begin
socket.Close;
self.ClientSocket1.Port := 0;
errorcode := 0;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);///退出
begin
if self.ClientSocket1.Active then
self.ClientSocket1.Active := false;
self.ClientSocket1.Socket.Close;
self.ClientSocket1.Port := 0;
end;
 
不用吧大哥,只要关了套接字就可以了
 
关了,不起作用,而且如果出现异常,也得先将端口关掉才能再连呀
 
把Socket的释放时间设置成0,然后出现异常你就把Socket关掉啊,这样端口就立即释放了。
大概的代码是加上这些
var
Linger: TLinger;
iRc:Integer;
begin
Linger.l_onoff := 1;
Linger.l_linger := 0;
iRc := SetSockOpt(SocketHandle, SOL_SOCKET, SO_LINGER, @Linger, SizeOf(Linger));
if iRc <> 0 then
RaiseLastOSError;
end;
 
帮顶!

╭=========================================╮

80G海量源代码,控件,书籍全免费狂下不停!

http://www.source520.com

个人网站站长开发推广同盟,让所有人知道你的世界!

http://www.source520.com/search/search.asp

╰=========================================╯
 
后退
顶部