急急急!! 在线等! ClientSocket 指定本机的端口号后(8001) 传送完文件后再连接提示 (10048 Address a

  • 主题发起人 主题发起人 金鱼
  • 开始时间 开始时间

金鱼

Unregistered / Unconfirmed
GUEST, unregistred user!
急急急!! 在线等! ClientSocket 指定本机的端口号后(8001) 传送完文件后再连接提示 (10048 Address already in use.) 。能不能传送完文件后,ClientSocket.close 时 发出指令取消 8001端囗绑定 ( 积分: 100 )<br />我用 ServerSocket 和 ClientSocket 作了一个文件传输的东东,考虑到防火墙的限制,ClientSocket 在发送文件的时候 指定本机的端囗号(8001)。传送完文件后 clientsocket.close; 为什么 后再连接提示 (10048 Address already in use.) 能不能传送完文件后,ClientSocket.close 时 发出指令取消 8001端囗绑定。

8001端囗绑定代码
---------------------------------------------------
procedure TForm1.ClientSocket1Lookup(Sender: TObject;
Socket: TCustomWinSocket);
var
SockAddrIn: TSockAddrIn; //uses winsock
iRc:Integer;
begin
SockAddrIn.sin_family := AF_INET;
SockAddrIn.sin_addr.S_addr := 0;
SockAddrIn.sin_port := htons(8001); //要绑定的端口
iRc:=bind(ClientSocket1.Socket.SocketHandle, SockAddrIn, sizeof(TSockAddrIn));
if iRc= 0 then
memo1.Lines.Add('绑定成功 8001 !')
else
memo1.Lines.Add(Format('%d',[WSAGetLastError()]));
end;

---------------------------------------------------
而为什么,如果 ClientSocket 用系统自动寻找的端囗 ClientSocket.close时 就可以立即释放端囗。 而采用指定的端囗时 ClientSocket.close 时就不能释放端囗。

注: (c 和 s 可能放在一个机器上也可能放在两台机器上,我不想通过关闭 s 的方式来达到关闭端囗的目的。)
 
我用 ServerSocket 和 ClientSocket 作了一个文件传输的东东,考虑到防火墙的限制,ClientSocket 在发送文件的时候 指定本机的端囗号(8001)。传送完文件后 clientsocket.close; 为什么 后再连接提示 (10048 Address already in use.) 能不能传送完文件后,ClientSocket.close 时 发出指令取消 8001端囗绑定。

8001端囗绑定代码
---------------------------------------------------
procedure TForm1.ClientSocket1Lookup(Sender: TObject;
Socket: TCustomWinSocket);
var
SockAddrIn: TSockAddrIn; //uses winsock
iRc:Integer;
begin
SockAddrIn.sin_family := AF_INET;
SockAddrIn.sin_addr.S_addr := 0;
SockAddrIn.sin_port := htons(8001); //要绑定的端口
iRc:=bind(ClientSocket1.Socket.SocketHandle, SockAddrIn, sizeof(TSockAddrIn));
if iRc= 0 then
memo1.Lines.Add('绑定成功 8001 !')
else
memo1.Lines.Add(Format('%d',[WSAGetLastError()]));
end;

---------------------------------------------------
而为什么,如果 ClientSocket 用系统自动寻找的端囗 ClientSocket.close时 就可以立即释放端囗。 而采用指定的端囗时 ClientSocket.close 时就不能释放端囗。

注: (c 和 s 可能放在一个机器上也可能放在两台机器上,我不想通过关闭 s 的方式来达到关闭端囗的目的。)
 
因为此时8001端口有可能处于time_wait状态中,如果不指定,连接的时候就不是8001了,可能是8002,8003,系统会分配一个空闲端口的
 
To zealothasu:
考虑到防火墙的限制 文件发送要用指定的端囗,其它的端囗都是不能使用的。
现在是 当发送完一个文件后 ,ClientSocket的连接自动断开,如果要再次发送文件要等好长时间才能再资连接。发送文件,否则就提示 (10048 Address already in use.) 错误。
能不能传送完文件后,ClientSocket.close 时 发出指令取消 8001端囗绑定。
 
time_wait 维持时间默认好像是4分钟,你可以在注册表中修改TcpTimedWaitDelay参数将起设为一个较小的值看看
 
后退
顶部