对于firemonkey,Delphi的GetHostByName等效?

时间:2017-04-03 02:48:11

标签: delphi firemonkey gethostbyname

firemonkey是否有任何GetHostByName等效,适用于桌面Win32 / Win64 / Mac?

3 个答案:

答案 0 :(得分:2)

查看System.Net.Socket,您会发现TIPAddress.LookupName具有您正在寻找的实施方案。在Posix上,它从gethostbyname调用Posix.NetDB

答案 1 :(得分:1)

如果您使用Indy,则其跨平台TIdStack界面具有公开ResolveHost()HostByName()方法(其中ResolveHost()调用HostByName()用于输入已经是一个IP地址)。 HostByName()内部使用getaddrinfo()gethostbyname(),具体取决于平台。

但需要注意的是,此类平台函数会返回一个IP地址列表,其中包含多个IP,但ResolveHost() / HostByName()目前只返回列表中的第一个IP 。如果您需要完整列表,则必须下拉到平台层并直接调用套接字函数。

答案 2 :(得分:-2)

我终于找到了办法(即使雷米的回答可能更好):

function GetIpFromHost(domain:string):string;
var
  Host: PHostEnt;
{$ifdef mswindows}
  SockAddrIn: TSockAddrIn;
  wsdata: twsadata;
  success: integer;
{$endif}
{$ifdef macos}
  in_addr:Posix.NetinetIn.in_addr;
{$endif}
begin
    result:='';

{$ifdef mswindows}
  success := WSAStartup($0101, wsdata);
  if Success = 0 then
    begin
    Host := GetHostByName(PAnsiChar(AnsiString(domain)));
    if Host <> nil then
        begin
      SockAddrIn.sin_addr.S_addr := longint(plongint(Host^.h_addr_list^)^);
      Result := inet_ntoa(SockAddrIn.sin_addr);
    end;
  end;
  WSACleanup;
{$endif}

{$ifdef macos}
host:=posix.NetDB.gethostbyname(pansichar(ansistring(domain)));
if host<>nil then
begin
    in_addr.s_addr:=PCardinal(Host.h_addr_list^)^;
    Result:=inet_ntoa(in_addr);
end;
{$endif}

end;