3

Dns.GetHostAddressesホスト名を解決するための小さなテスト プログラムを作成しました。存在しないホスト名を入力するSocketExceptionと、 がスローされ、メッセージはNo such host is known.
エラー メッセージが UI に表示するのに十分小さいので、私はこれが気に入りました。

今、私は文字通りコードをコピーしてやや大きなプロジェクトに貼り付けましたが、今回はテストプロジェクトで行ったのとまったく同じホスト名を入力すると、スローSocketExceptionされますが、メッセージはに設定されていますThe requested name is valid, but no data of the requested type was found

どちらのスタック トレースも各プログラムで同じですが、最初のエラーはWSAHOST_NOT_FOUND2 番目のエラーの場所ですWSANO_DATA

独自のエラー メッセージを出力することもできますが、毎回異なるエラーがスローされる理由を知りたいですか? コードに違いはありません。

また、各プログラムを何度実行しても、同じエラー メッセージが出力され続けるようです。交互でも何でもない。

================================================== =========================

さて、私は何が問題を引き起こしているのかを理解しました。
私はPcap.Netを参照として追加し、それを私のプロジェクトに含めていましたが、それusing PcapDotNet.Core;
をコメントアウトした後Dns.GetHostAddresses、正しい例外をスローしていました。

なぜそのように振る舞うか、そしてそれを回避する方法を誰かが教えてくれたら、それは素晴らしいことです.

4

1 に答える 1

2

SocketExceptionで aが発生する理由はたくさんありますGetHostAddresses。の場合はWSA_NODATA、DNS にエントリがあることを意味します。ただし、IP アドレスはありません (つまり、A レコードはありません)。DNS サーバーにアクセスできないが、データがキャッシュされている場合は、別のエラーが発生する可能性があります。または、DNS サーバーに到達できず、データがキャッシュされていない場合、別のエラーが発生することがあります。残念ながらGetHostAddresses、これらのエラーはすべて 1 つの例外タイプにラップされます。エラーの種類ごとに異なることをしたい場合は、 で関連するプロパティを確認する必要がありますSocketException。「うまくいかなかった」ことを検出したいだけなら、チェックする必要はありません。SocketExceptionただし、失敗によってメッセージが異なることは明らかなので、単に使用することはお勧めしませんMessage. 言うまでもなく、これは Windows の他の言語バージョンでも翻訳されるため、このメッセージを除いて、アプリケーションの残りの部分が英語であると奇妙に見えるかもしれません。

WSANOTINITIALIZED技術的には、WSAENETDOWNWSAHOST_NOT_FOUNDWSATRY_AGAINWSANO_RECOVERYWSANO_DATAWSAEINPROGRESSWSAEFAULTおよびのいずれかのエラーが発生する可能性がありWSAEINTRます。いくつかは非常にありそうもないですが。

また、IPv6 が使用されているか IPv4 が使用されているかによって、異なるメッセージが表示されると思います。

于 2012-08-02T20:32:53.090 に答える