delphi  如何随机获取一个未占用的端口?谢谢

解决方案 »

  1.   

    端口号设置为0,然后进行bind,系统不会随机分配一个端口。
      

  2.   

    看了以前的帖子,有个朋友的问题大概是这样的:
    将Idtcpserver的defaultport设置为0,当active为true时,查看Idtcpserver.defaultport,显示为0,
    而他想知道的却是那个随机分配给Idtcpserver的端口是多少?
    而这个也是我想知道的!!谢谢
      

  3.   

    uses
      winsock;var
      wsadat: TWSAData;
      sd: TSocket;
      sa:             TSockAddr;
      sain:             TSockAddrIn;
      sain_len: Integer;
    begin
      WSAStartup(makeword(1,0),wsadat);
      try
        sd :=socket(  AF_INET
                              , SOCK_STREAM
                              , IPPROTO_IP
                              );
        fillchar(sa, sizeof(TSockAddr), 0);
        sa.sin_family := AF_INET;
        sa.sin_port := 0;//0表示随机分配端口
        sa.sin_addr.S_addr := inet_addr('0.0.0.0');    bind(sd,sa,sizeof(sa));
        sain_len := sizeof(sain);
        getsockname(sd,sain, sain_len);
        ShowMessage(IntToStr(htons(sain.sin_port)));//bind之后被随机分配到的端口
      finally
        WSACleanup;
      end;end;
      

  4.   

    TIdTCPServer的OnAfterBind事件
    procedure TForm1.IdTCPServer1AfterBind(Sender: TObject);
    var
      wsadat: TWSAData;
      sd: TSocket;
      sain:             TSockAddrIn;
      sain_len: Integer;
    begin
      WSAStartup(makeword(1,0),wsadat);
      try
        sd :=IdTCPServer1.Bindings.Items[0].Handle;
        sain_len := sizeof(sain);
        getsockname(sd,sain, sain_len);
        ShowMessage(IntToStr(htons(sain.sin_port)));
      finally
        WSACleanup;
      end;
    end;
      

  5.   

    也可以直接在OnAfterBind事件当中直接读取
    procedure TForm1.IdTCPServer1AfterBind(Sender: TObject);
    begin
      ShowMessage(IntToStr(IdTCPServer1.Bindings.Items[0].Port));
    end;
      

  6.   

    谢谢,unsigned 你是个好人