从SocketHandle获取IP和端口

Ben*_*iss 3 delphi winapi winsock

如何sockaddr_in从套接字句柄中获取关联,以便从中获取端口和地址?或者还有什么关于如何从SocketHandle获取IP和端口?

例如:

function GetSocketPort ( s : TSocket ) : Integer;
var
  Addr                  : sockaddr_in;
begin
  // Get sockaddr_in from a socket
end;

function GetSocketAddress ( s : TSocket ) : String;
var
  Addr                  : sockaddr_in;
begin
  // Get sockaddr_in from a socket
end;

function ConnectToHost (Host : pchar; Port : Integer) : TSocket;
var
  Addr                  : sockaddr_in;
begin
  Addr.sin_family       := AF_INET;
  Addr.sin_port         := htons(Port);
  result                := Socket(AF_INET, 1, 6);
  Addr.sin_addr.S_addr  := INET_ADDR(Host);
  if not( (Connect(result, Addr, SizeOf(Addr)) = 0) ) then result := 0;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  MySocket : TSocket;
begin
  MySocket := ConnectToHost ('127.0.0.1', 8080);
  if MySocket <> 0 then begin
    // GetSocketAddress (MySocket);
    // GetSocketPort (MySocket);
  end;
end;
Run Code Online (Sandbox Code Playgroud)

RRU*_*RUZ 7

您可以使用getsockname本地端口和地址的功能以及getpeername远程端口的功能

function GetLocalSocketPort ( s : TSocket ) : Integer;
var
  Addr                  : TSockAddrIn;
  Size: integer;
begin
  Size := sizeof(Addr);
  getsockname(s, Addr, Size);
  Result := ntohs(Addr.sin_port);
end;

function GetLocalSocketAddress ( s : TSocket ) : String;
var
  Addr                  : TSockAddrIn;
  Size: integer;
begin
  Size := sizeof(Addr);
  getsockname(s, Addr, Size);
  Result := inet_ntoa(Addr.sin_addr);
end;


function GetRemoteSocketPort ( s : TSocket ) : Integer;
var
  Addr                  : TSockAddrIn;
  Size: integer;
begin
  Size := sizeof(Addr);
  getpeername(s, Addr, Size);
  Result := ntohs(Addr.sin_port);
end;

function GetRemoteSocketAddress ( s : TSocket ) : String;
var
  Addr                  : TSockAddrIn;
  Size: integer;
begin
  Size := sizeof(Addr);
  getpeername(s, Addr, Size);
  Result := inet_ntoa(Addr.sin_addr);
end;
Run Code Online (Sandbox Code Playgroud)

  • `getsockname()`返回套接字绑定的本地IP /端口.还有`getpeername()`,它返回套接字所连接的远程IP /端口.此外,报告的端口是网络字节顺序,因此您需要使用`ntohs()`来转换它:`Result:= ntohs(Addr.sin_port)`. (4认同)
  • @RemyLebeau,我刚刚更新了答案,我假设哪个OP只想知道本地端口和地址,我还添加了`ntohs`调用. (2认同)