TIdStack.LocalAddress を使用してローカル IP アドレスを取得しています。IP6 と IP4 の両方を持つ OS X システムでは、これは IP6 アドレスを返しますが、これは私が望むものではありません。
ローカル IP4 アドレスを見つける最良の方法は何ですか? たとえば、TIdStack.LocalAddresses の最短のエントリを単純に使用できます。
TIdStack.LocalAddress を使用してローカル IP アドレスを取得しています。IP6 と IP4 の両方を持つ OS X システムでは、これは IP6 アドレスを返しますが、これは私が望むものではありません。
ローカル IP4 アドレスを見つける最良の方法は何ですか? たとえば、TIdStack.LocalAddresses の最短のエントリを単純に使用できます。
プロパティは、プロパティTIdStack.LocalAddress
にリストされている最初のIPを返すだけですTIdStack.LocalAddresses
(注-これらのプロパティはスレッドセーフではないため非推奨です。TIdStack.AddLocalAddressesToList()
代わりにメソッドを使用する必要があります)。PC /デバイスは、複数のネットワークに接続されている場合や、IPv4とIPv6の両方をサポートしている場合など、複数のローカルIPを持つことができます。LocalAddresses
リスト内のIPの順序は、IndyではなくOSによって決定されます。その音から、完全なリストを取得し、それをループして、関心のあるIPv4アドレスを探す必要があります。
TIdStackVCLPosix
IndyがMacOSXに使用するは、実際には、プロパティTIdStack
内のIPv4アドレスとIPv6アドレスの両方のレポートを現在サポートしている唯一の実装です(他の実装は、現時点ではIPv4のみをサポートしています)。ただし、リストは単純であり、特定のIPがIPv4であるかIPv6であるかを区別しません(その情報を提供するためにプロパティを使用しません)。区別する必要がある場合は、IPを手動で解析する必要があります。将来のリリースでは、Indyはプロパティを、IPバージョン情報をネイティブに提供する別の実装に置き換えます。LocalAddresses
TIdStack
TStrings
TStrings.Objects
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;