2

TIdStack.LocalAddress を使用してローカル IP アドレスを取得しています。IP6 と IP4 の両方を持つ OS X システムでは、これは IP6 アドレスを返しますが、これは私が望むものではありません。

ローカル IP4 アドレスを見つける最良の方法は何ですか? たとえば、TIdStack.LocalAddresses の最短のエントリを単純に使用できます。

4

1 に答える 1

4

プロパティは、プロパティTIdStack.LocalAddressにリストされている最初のIPを返すだけですTIdStack.LocalAddresses(注-これらのプロパティはスレッドセーフではないため非推奨です。TIdStack.AddLocalAddressesToList()代わりにメソッドを使用する必要があります)。PC /デバイスは、複数のネットワークに接続されている場合や、IPv4とIPv6の両方をサポートしている場合など、複数のローカルIPを持つことができます。LocalAddressesリスト内のIPの順序は、IndyではなくOSによって決定されます。その音から、完全なリストを取得し、それをループして、関心のあるIPv4アドレスを探す必要があります。

TIdStackVCLPosixIndyがMacOSXに使用するは、実際には、プロパティTIdStack内のIPv4アドレスとIPv6アドレスの両方のレポートを現在サポートしている唯一の実装です(他の実装は、現時点ではIPv4のみをサポートしています)。ただし、リストは単純であり、特定のIPがIPv4であるかIPv6であるかを区別しません(その情報を提供するためにプロパティを使用しません)。区別する必要がある場合は、IPを手動で解析する必要があります。将来のリリースでは、Indyはプロパティを、IPバージョン情報をネイティブに提供する別の実装に置き換えます。LocalAddressesTIdStackTStringsTStrings.ObjectsTIdStack.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;
于 2013-02-25T20:24:04.523 に答える