firemonkey是否有任何GetHostByName等效,适用于桌面Win32 / Win64 / Mac?
答案 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;