Dns.GetHostEntryは、空のAddressListを持つIPHostEntryを返すことができますか?
質問
ホスト名は正常に解決できるが、返されたhostEntry.AddressListが空の場合があるのではないかと思っています。
現在、私はこのようなことをしています:
IPHostEntry hostEntry = Dns.GetHostEntry("some.hostname.tld");
if (hostEntry.AddressList.Count() < 1)
{
// can that ever happen?
throw new ArgumentException("hostName has no assigned IP-Address");
}
TcpClient client = new TcpClient(hostEntry.AddressList[0], 1234);
ホスト名が見つからないか、AddressListが空でない場合、Dns.GetHostEntryが例外をスローすることを前提としていますが、それについてはわかりません。
解決
いいえ、空のアドレスリストは表示されません:存在するがAまたはAAAA(IPv6)レコードを持たないDNSラベルを照会しても、SocketException(&quot; No Such Host is Known&quot;)はスローされます。
.NET Reference SourceリリースのDNS.csの関数 InternalGetHostByName(string hostName、bool includeIPv6)
を見ると、これを確認できます。一部のプラットフォーム固有の予防措置を除き、DNSルックアップはWinsock gethostbyname 関数。
Gethostbynameは失敗するか、アドレス一覧を返します。この場合、関数はWSANO_DATA(「有効な名前、要求されたタイプのデータレコードなし」)で失敗するため、空のアドレスリストは返されません。これは、.NETで既に見たソケット例外に変換されます。
とにかく空のリストが返されることを示す応答によって促された2012年5月の編集:この回答はWin32にのみ適用され、WinCEのようなプラットフォームはまったく異なる動作をする可能性があることに注意してください。 Win32で「空のリスト」の動作が見られ、リクエストが公開されているDNSサーバーに対するものである場合は、コードを投稿してください...
他のヒント
記録だけ。
mdbの受け入れられた回答に感謝します WSANO_DATAエラーの説明を確認しました:
要求された名前は有効であり、データベースで見つかりましたが、見つかりました 解決される正しい関連データがありません。通常の例 これは、ホスト名からアドレスへの変換の試みです(gethostbynameまたは DNS(ドメインネームサーバー)を使用するWSAAsyncGetHostByName)。 MXレコード が返されますが、ホスト自体が存在することを示すAレコードはありませんが、 直接到達可能。
だから、これは私の質問にほとんど答えます:)
ここには3つの状況が考えられます:
-
ホスト名が存在し(DNSにAレコードがある)、IPアドレスに解決される
- 条件がヒットしない
-
ホスト名は存在しますが(DNSはドメインを認識しています)、Aレコードは存在しません。
- これは非常にまれなシナリオであり、そもそもこれは決して起こり得ないと思います。
-
ホスト名が存在しません
- 例外がスローされ、そこに到達することはありません。
いいえ、私はそれが起こることはないと思います。
答えは YES です。 GetHostEntryメソッドは、IPアドレスとIPアドレスに関連付けられたエイリアスをDNSサーバーに照会します。
ローカルコンピューターにIPv6がインストールされていない場合、GetHostEntryメソッドの結果からIPv6アドレスがフィルター処理されます。その結果、アドレスパラメータにIPv6のみが使用可能な場合、空のIPHostEntryインスタンスを取得することができます。
返されるIPHostEntryインスタンスのAliasesプロパティは、このメソッドによって設定されず、常に空になります。