gpt4 book ai didi

macos - 如何使用Indy获取本地IP4地址?

转载 作者:行者123 更新时间:2023-12-02 04:59:24 24 4
gpt4 key购买 nike

我正在使用 TIdStack.LocalAddress 来获取本地 IP 地址。在同时具有 IP6 和 IP4 的 OS X 系统上,这将返回 IP6 地址,这不是我想要的。

查找本地 IP4 地址的最佳方法是什么?例如,我可以简单地使用 TIdStack.LocalAddresses 中最短的条目。

最佳答案

TIdStack.LocalAddress 属性仅返回在 TIdStack.LocalAddresses 属性中列出的第一个 IP(注意 - 这些属性已被弃用,因为它们不是线程安全的) . 您应该使用 TIdStack.AddLocalAddressesToList() 方法代替)。一台 PC/设备可以有多个本地 IP,例如是否连接到多个网络、同时支持 IPv4 和 IPv6 等。LocalAddresses 列表中 IP 的顺序由操作系统决定,不是印地。从它的声音来看,您必须获取完整的列表并循环查找您感兴趣的 IPv4 地址。

Indy 在 Mac OSX 中使用的

TIdStackVCLPosix 实际上是当前唯一支持在 LocalAddresses 中报告 IPv4 和 IPv6 地址的 TIdStack 实现> 属性(其他 TIdStack 实现目前仅支持 IPv4)。但是,该列表是一个普通的 TStrings,它不区分给定的 IP 是 IPv4 还是 IPv6(它不使用 TStrings.Objects 属性来提供该信息) 。如果需要区分,则必须手动解析 IP。在未来的版本中,Indy 将使用本地提供 IP 版本信息的不同实现替换 TIdStack.LocalAddress(es) 属性。

例如:

var
IPs: TStringList;
IP: String;
I: Integer;
Err: Boolean;
begin
IPs := TStringList.Create;
try
GStack.AddLocalAddressesToList(IPs);
for I := 0 to IPs.Count-1 do
begin
IP := IPs[I];

// TIdStack.IsIP() currently only supports IPv4, but
// it will be updated to support IPv6 in a future
// release...
//
// if GStack.IsIP(IP) then
// if GStack.IsIPv4(IP) then

IPv4ToDWord(IP, Err);
if not Err then
Break;
IP := '';

// alternatively:
{
IPAddr := TIdIPAddress.MakeAddressObject(IPs[I]);
IP := IPAddr.IPv4AsString; // returns blank if not IPv4
IPAddr.Free;
if IP <> '' then
Break;
}
end;
finally
IPs.Free;
end;
if IP <> '' then
begin
// use IP as needed...
end;
end;

关于macos - 如何使用Indy获取本地IP4地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15071564/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com