Socket Error # 10048 Address already in use
场景:怎么解决socket error #10048 address already in use的有关问题?
如何解决socket error #10048 address already in use的问题?在线等!
我做了一个模拟“多客户端--单服务器”的程序,客户端循环创建10个IdTcpClient,并指定其端口和IP地址,第一次运行时不会出错,当断开连接后也就是释放资源,重新再次创建10个idTcpClient的时候就会出错,报:socket error #10048 address already in use,也找了一些资料,但是不是太清除,部分代码如下,请各位大哥大姐们帮忙,先谢谢各位了。
客户端:
//--创建的10个TIdTcpClient,连接服务器
procedure TForm1.btn_LinkClick(Sender: TObject);
var
i : Integer;
begin
for i:=0 to 0 do
begin
try
application.ProcessMessages;
Stat.Panels.Items[1].Text := 'idtcpclnt'+inttostr(i)+'正在连接服务器!';//--提示信息
idtcpclnt := TIdTCPClient.Create(nil);
idtcpclnt.BoundIP := '192.168.0.113';//--指定客户端的Ip地址
idtcpclnt.BoundPort := 2000+i;//--指定客户端的port号
ReceiveThread := TReceiveThread.create(LB_Content,idtcpclnt,true);//--接收线程用于从服务器端接受数据
ReceiveThread.localIp := '192.168.0.113';//--接收线程的标识
ReceiveThread.localPort := 2000+i;
idtcpclnt.Host := '127.0.0.1';//--服务器ip地址
idtcpclnt.Port := 2003;//--服务器port
idtcpclnt.Connect();
fIdTcpClientList.Add(Pointer(idtcpclnt));//--fIdTcpClientList用于保存创建的IdTcpClient
ReceiveThread.Resume;
fReceiveThreadList.Add(ReceiveThread);//--fReceiveThreadList保存接受线程。
Stat.Panels.Items[1].Text := 'idtcpclnt'+inttostr(i)+'连接服务器完成!';//--显示信息
except
Stat.Panels.Items[1].Text := 'idtcpclnt'+inttostr(i)+'连接服务器失败!';
end;
end;
end;
//断开连接
procedure TForm1.btn_disLinkClick(Sender: TObject);
var
i : Integer;
begin
for i:= 0 to fReceiveThreadList.Count-1 do
begin
if ((TReceiveThread(fReceiveThreadList.Items[i]))<> nil) and (TIdTCPClient(fIdTcpClientList.Items[i])).Connected then
begin
(TReceiveThread(fReceiveThreadList.Items[i])).Resume;
(TReceiveThread(fReceiveThreadList.Items[i])).Terminate;
(TIdTCPClient(fIdTcpClientList.Items[i])).Disconnect;
(TIdTCPClient(fIdTcpClientList.Items[i])).Free;
end;
end;
fReceiveThreadList.Clear;
fIdTcpClientList.Clear;
end;
第一次连接服务器时,没问题,当断开再连接时就会报错误,请问该怎么解决?
------解决方案--------------------
如何解决socket error #10048 address already in use的问题?在线等!
我做了一个模拟“多客户端--单服务器”的程序,客户端循环创建10个IdTcpClient,并指定其端口和IP地址,第一次运行时不会出错,当断开连接后也就是释放资源,重新再次创建10个idTcpClient的时候就会出错,报:socket error #10048 address already in use,也找了一些资料,但是不是太清除,部分代码如下,请各位大哥大姐们帮忙,先谢谢各位了。
客户端:
//--创建的10个TIdTcpClient,连接服务器
procedure TForm1.btn_LinkClick(Sender: TObject);
var
i : Integer;
begin
for i:=0 to 0 do
begin
try
application.ProcessMessages;
Stat.Panels.Items[1].Text := 'idtcpclnt'+inttostr(i)+'正在连接服务器!';//--提示信息
idtcpclnt := TIdTCPClient.Create(nil);
idtcpclnt.BoundIP := '192.168.0.113';//--指定客户端的Ip地址
idtcpclnt.BoundPort := 2000+i;//--指定客户端的port号
ReceiveThread := TReceiveThread.create(LB_Content,idtcpclnt,true);//--接收线程用于从服务器端接受数据
ReceiveThread.localIp := '192.168.0.113';//--接收线程的标识
ReceiveThread.localPort := 2000+i;
idtcpclnt.Host := '127.0.0.1';//--服务器ip地址
idtcpclnt.Port := 2003;//--服务器port
idtcpclnt.Connect();
fIdTcpClientList.Add(Pointer(idtcpclnt));//--fIdTcpClientList用于保存创建的IdTcpClient
ReceiveThread.Resume;
fReceiveThreadList.Add(ReceiveThread);//--fReceiveThreadList保存接受线程。
Stat.Panels.Items[1].Text := 'idtcpclnt'+inttostr(i)+'连接服务器完成!';//--显示信息
except
Stat.Panels.Items[1].Text := 'idtcpclnt'+inttostr(i)+'连接服务器失败!';
end;
end;
end;
//断开连接
procedure TForm1.btn_disLinkClick(Sender: TObject);
var
i : Integer;
begin
for i:= 0 to fReceiveThreadList.Count-1 do
begin
if ((TReceiveThread(fReceiveThreadList.Items[i]))<> nil) and (TIdTCPClient(fIdTcpClientList.Items[i])).Connected then
begin
(TReceiveThread(fReceiveThreadList.Items[i])).Resume;
(TReceiveThread(fReceiveThreadList.Items[i])).Terminate;
(TIdTCPClient(fIdTcpClientList.Items[i])).Disconnect;
(TIdTCPClient(fIdTcpClientList.Items[i])).Free;
end;
end;
fReceiveThreadList.Clear;
fIdTcpClientList.Clear;
end;
第一次连接服务器时,没问题,当断开再连接时就会报错误,请问该怎么解决?
------解决方案--------------------
- Delphi(Pascal) code
idtcpclientlist:array[0..9] of TIdTcpClient; for i:=0 to 9 do begin idtcpclientlist[i]:=TIdTcpClient.Create( Owner ); ............... end; for i:=9 downto 0 do begin idtcpclientlist[i].disconnect; idtcpclientlist[i].free; end;
------解决方案--------------------
idtcpclnt.BoundPort := 2000+i;//--指定客户端的port号
这个不指定.
------解决方案--------------------
那在你模拟完成后,释放client所占的端口资源.或者直接释放client.
------解决方案--------------------
创建的时候 for i:=0 to 9 do
释放的时候 for i:=9 downto 0 do
------解决方案--------------------
楼上正解,记住,server端被连接的时候,list add没关系,但是释放的时候,一定要从后往前来,否则list会前移