7

MSDNでは、廃止さたと記載されています。GetHostByName交換品はGetHostEntry. それらの違いは何ですか?

4

2 に答える 2

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 アドレスを に渡すと逆引きGetHostEntryDNS ルックアップが実行されます。いずれにせよ、返された構造は 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();
于 2019-06-03T21:20:17.240 に答える