MSDNでは、廃止されたと記載されています。GetHostByName
交換品はGetHostEntry
. それらの違いは何ですか?
2 に答える
まず、これらが UNIX ソケット ライブラリのラッパーであることを認識することが重要です。これは、関数inet_aton
( と同等IPAddress.Parse
)、gethostbyname
( でラップDns.GetHostByName
)、およびgethostbyaddr
( でラップ) を公開しますDns.GetHostByAddress
。Microsoft はその後Dns.GetHostEntry
、これらに基づいてユーティリティ関数を追加しました。
との哲学的な違いを熟考しDns.GetHostByName
た結果、マイクロソフトは、DNS ルックアップ用に公開するプライマリ API は実際の DNS エントリDns.GetHostEntry
のみを返すようにすべきであると判断したという結論に達しました。
UNIX ソケット レベルでgethostbyname
は、IP アドレスまたはホスト名のいずれかを取ることができます。それがあなたが提供したものである場合、IPアドレスの解析として明示的に文書化されています。しかし、IPv4 アドレスのみをサポートすることも明示的に文書化されています。そのため、開発者はgetaddrinfo
代わりに関数を使用することをお勧めします。この関数は、接続したいサービスも含めてより複雑なルックアップを行い、IPv4 以外のアドレス ファミリをサポートします。
Microsoft は、ラッパーで別のアプローチを採用しました。彼らはまだGetHostByName
非推奨であると考えていますが、ルックアップをサービスデータベースに結び付ける代わりに、要求する実際の物理 DNS ホストエントリを返す関数を作成することにしました. 有効なアドレスを含む文字列を提供するだけでは十分ではありません。DNS エントリがない場合GetHostEntry
は失敗します。これが目的であるためです。したがって、ホスト名を にGetHostEntry
渡すと正引き DNS ルックアップが実行され、IP アドレスを に渡すと逆引きGetHostEntry
DNS ルックアップが実行されます。いずれにせよ、返された構造は DNS エントリ名と関連付けられたアドレスの両方を教えてくれますが、関連付けられたエントリがない場合、返されるのはエラーだけです。
接続のターゲットを提供するユーザー入力を処理しようとしてGetHostEntry
いる場合は、ユーザーがアドホック IP アドレスを入力すると、IP アドレスであるため解決に失敗する可能性があるため、実際には適していません。接続を確立するために必要なすべて。GetHostByName
はまさにこの場合に必要な機能ですが、Microsoft はこれを廃止することを選択しました。GetHostByName
非推奨を考えると、イディオムは、@Faisai Mansoor が逆コンパイルされた関数で示した「最初に解析を試みる」アプローチを複製することになります。
// Microsoft's internal code for GetHostByName:
if (IPAddress.TryParse(hostName, out address))
return Dns.GetUnresolveAnswer(address);
else
return Dns.InternalGetHostByName(hostName, false);
これはクラスの内部実装の詳細を使用しますDns
が、その精神は独自のコードで簡単に複製できます。
if (!IPAddress.TryParse(userInput, out var addressToWhichToConnect))
addressToWhichToConnect = Dns.GetHostEntry(userInput).AddressList.First();