0

http://checkip.dyndns.org/が返すように、ネットワーク IP アドレスを取得しようとしています。

しかし、私は次のコードからこの結果を得ています。

fe80::28d3:b8e8:caab:63b3%10

122.168.149.143 のようなインターネットドット整数形式の IP アドレスが必要です

foreach (IPAddress ipa in Dns.GetHostAddresses(Dns.GetHostName()))
{
    if (ipa.AddressFamily == AddressFamily.InterNetwork)
    {
        textBox2.Text = ipa.ToString();
        break;
    }
}
4

2 に答える 2

3

IPv4 アドレスでフィルタリングしようとしているのに、現在 IPv6 アドレスでフィルタリングしています! これが、IPAddress.ToString() がコロン 16 進表記で IP を返す理由です。

IPv4 アドレスでフィルタリングするには、代わりに AddressFamily.InterNetwork に従ってフィルタリングする必要があります。

if (ipa.AddressFamily == AddressFamily.InterNetwork)
{ }

あなたが公開アドレスを取得したいということは承知しています。リストしたコードは、プライベート (ローカル) アドレスを返します!

Windows オペレーティング システムは、パブリック IP を気にしません。オペレーティング システムは、定義されたゲートウェイにルーティングするだけで、詳細は気にしません。パブリック IP を解決する唯一の方法は、外部システムにクエリを実行することです。外部の助けが必要です。

パブリック アドレスを取得する最も信頼できる方法は、パブリック アドレスを解決してプレーンテキストで出力できる外部 Web サーバーに接続することです。あなたの質問には、すでに適切なサービスがリストされています。自分でサービスを提供することで、サービスの責任を負うこともできます。これを実現するための PHP コードは非常に単純です。

ルーターが UPnP (または SNMP) をサポートしている場合、ルーターにクエリを実行できますが、これは機能しない可能性があります。あなたのマシンにはこれで十分かもしれませんが、一部のルーターは UPnP をサポートしておらず、セキュリティ意識の高いユーザーはセキュリティ ホールのために UPnP を無効にしている可能性があります。管理された UpNp ライブラリについては、この SO の質問を参照してください。

tracertを使用して、確立された Web サイト (オンラインになることがわかっている Web サイト) にアクセスでき、最初の「ホップ」がルートになることを読みました。私はこれを試したことがありません。

于 2013-06-29T12:56:58.020 に答える
1

ドット整数形式はIP版のみ使用可能です。4 つのアドレス。

コード サンプルでは、​​IP バージョンのみを明示的に選択しています。6 つのアドレス。

IPv4 アドレスを選択するAddressFamily.InterNetwork代わりに使用すると、期待どおりにフォーマットされます。AddressFamily.InterNetworkV6ToString

于 2013-06-29T12:55:15.560 に答える