我写 Addr.sin_port := htons(0); 之后 会分一个端口给他  用什么函数能得到这个端口呢 ??

解决方案 »

  1.   

    getsockname怎么用阿 我还是个新手啊..
      

  2.   

    我会了我会了 答案公布一下 。
       这样的 。
    var
      ...
      Addr: TSockAddrIn;
      AddrLen: integer;
      ...
    begin
      ...
      addrlen:=sizeof(addr);
      getsockname(mysocket,@addr,addrlen);
      showmessage(htons(addr.sin_port));
    end;
      

  3.   

    var
      WSADat: TWSAData;
      sd: TSocket;
      Sockaddr: Tsockaddr;
      Addr: TSockAddrIn;
      Addr_Len: Integer;
    begin
      if WSAStartup(WINSOCK_VERSION,WSADat) <> 0 then Exit;
      Sd := WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, Nil, 0, 0);
      if Sd = INVALID_SOCKET then begin
        WSACleanup;
        Exit;
      end;  Sockaddr.sin_family := AF_INET;
      Sockaddr.sin_port := htons(0);
      Sockaddr.sin_addr.S_addr := ADDR_ANY;
      if bind(Sd,@Sockaddr, sizeof(TSockAddr)) <> 0 then begin
        closesocket(Sd);
        WSACleanup;
        Exit;
      end;
      Addr_Len := sizeof(TSockAddrIn);
      if getsockname(Sd, Addr, Addr_Len) <> 0 then begin
        closesocket(Sd);
        WSACleanup;
        Exit;
      end;
      ShowMessage(IntToStr(ntohs(Addr.sin_port)));
      CloseSocket(Sd);
      WSACleanup;
    end;