簡體   English   中英

如何使用Indy獲取本地IP4地址?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM