我做了一个模拟“多客户端--单服务器”的程序,客户端循环创建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;
第一次连接服务器时,没问题,当断开再连接时就会报错误,请问该怎么解决?

解决方案 »

  1.   

    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;
      

  2.   

    请问:用list和array有什么不同吗?
      

  3.   

    to:hongqi162
       不好意思,我试过你的方法了,不行的,还是那个错误。
      

  4.   

      idtcpclnt.BoundPort := 2000+i;//--指定客户端的port号
    这个不指定.
      

  5.   

    我这是模拟的多客户端,实际用的时候,每个客户端都是独立的,都有ip地址和端口号的,所以idtcpclnt.BoundPort := 2000+i;//--指定客户端的port号 
    是要指定的
      

  6.   

    那在你模拟完成后,释放client所占的端口资源.或者直接释放client.
      

  7.   

    to:hutball
       我已经释放IdTcpClient了,   
    (TIdTCPClient(fIdTcpClientList.Items[i])).Disconnect; 
    (TIdTCPClient(fIdTcpClientList.Items[i])).Free; 
    我是释放后,再次重连时发生的错误,请问如何释放端口资源?to:Brightyang
       我刚接触socket通信不久,不知道你说的正确答案指的什么,还望赐教!
      

  8.   

    创建的时候 for i:=0 to 9 do
    释放的时候 for i:=9 downto 0 do
      

  9.   

    楼上正解,记住,server端被连接的时候,list  add没关系,但是释放的时候,一定要从后往前来,否则list会前移