[英]How to get local IP4 address using Indy?
我正在使用TIdStack.LocalAddress來獲取本地IP地址。 在同時具有IP6和IP4的OS X系統上,這將返回IP6地址,這不是我想要的。
查找本地IP4地址的最佳方法是什么? 例如,我可以簡單地使用TIdStack.LocalAddresses中的最短條目。
該TIdStack.LocalAddress
屬性只是返回在列出的第一個IP TIdStack.LocalAddresses
財產(注意-這些特性已被棄用,因為它們不是線程安全的,您應該使用TIdStack.AddLocalAddressesToList()
方法來代替)。 PC /設備可以具有多個本地IP,例如是否連接到多個網絡,同時支持IPv4和IPv6等LocalAddresses
列表中IP的順序由操作系統而不是Indy確定。 從它的聲音中,您將必須獲取完整的列表,並在其中循環查找所需的IPv4地址。
TIdStackVCLPosix
,其中印使用的Mac OSX,實際上是唯一TIdStack
,目前支持在報告兩個IPv4和IPv6地址實現LocalAddresses
屬性(其它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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.