首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

怎么解决socket error #10048 address already in use的有关问题?

2012-04-27 
如何解决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;
第一次连接服务器时,没问题,当断开再连接时就会报错误,请问该怎么解决?

[解决办法]

Delphi(Pascal) code
idtcpclientlist:array[0..9] of TIdTcpClient;for i:=0 to 9 dobegin  idtcpclientlist[i]:=TIdTcpClient.Create( Owner );  ...............end;for i:=9 downto 0 dobegin  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会前移

热点排行