2

UdpClientUDP ネットワーキングにC# クラスを使用しています。固定ローカル ポートにバインドされたオブジェクトが 1 つありUdpClientますが、リモート エンドポイントにはバインドされていません。これは、複数の異なるエンドポイントとの間で送受信できる必要があるためです。

2 つのスレッドがあります。1 つは送信用、もう 1 つは受信用です。ここで、存在するがそのポートでリッスンしないエンドポイントにデータを送信すると、SocketException. そして、私はそれを手に入れます。残念ながら、Send例外を返すのは私の呼び出しではなく、Receive呼び出しです。したがって、送信スレッドで「無効な」エンドポイントにデータを送信すると、受信スレッドで例外が発生します。残念ながら、その時点ではもちろん、どのエンドポイントがその例外を発生させたのかわかりません。

送信前にエンドポイントを格納し、受信スレッドでエンドポイントにアクセスすることは、競合状態エラーが発生するのを待っているだけです。

残念ながら、SocketExceptionエラーの原因となったエンドポイントはわかりません。

何か案は?送信スレッドで例外をスローすることは何とか可能ですか?

助けていただければ幸いです。

4

2 に答える 2

3

UDP パケットを送信するとsend()、ネットワーク上に出て効果的に消えます。フィードバックがまったく得られると想定しないでください。

場合によっては、送信先にリスナーがいない場合でも、送信先親切にメッセージを送り返すことがありICMP_UNREACH_PORTます。その間にあるルーターは、そのメッセージをオペレーティングシステムに配信するのに十分親切かもしれません. その場合、元のsend()電話が戻ってきてから時間がかかります。の場合ICMP_UNREACH_PORT、OS は通常それをキャッシュし、次にsend()同じ宛先に対して を実行したときにエラーを報告します。他の ICMP メッセージ (取得している例外について言及していません) は、他の呼び出しに影響を与える可能性があります。

つまり、UDP エラーがいつ報告されるか、または報告されるかどうかはわかりません。それは多くの変数に依存します。そのため、あらゆる呼び出しで例外を処理する準備をし、エラーが報告されずにパケットが消えてしまうことを覚悟してください。

于 2012-01-12T19:49:58.237 に答える
0

これはUDPの予想される動作だと思います。UDPsend()はブロック操作ではないため、潜在的なエラーを待ちません。(ポートが閉じているアクティブなホストに送信するときにエラーメッセージが確実に受信されることに依存できないという事実は言うまでもありません-ファイアウォールで保護されているか、レートが制限されているか、輻輳などによりドロップされる可能性があります。)

UDP ソケットを特定のリモート エンドポイントに接続できconnect()ます。これにより、一意のポート番号が割り当てられ、OS がその特定のエンドポイントからのエラーを他のランダム ホストから区別できる可能性が高くなります。ただし、繰り返しますが、これらのエラーを処理する機能に頼るべきではありません。

例外にこれ以上の情報がないのは残念です。これは、.NET が UDP ソケットを処理する方法の見落としのようです。ドキュメントによると、例外の ErrorCode を確認し、エラーを適切に処理する必要があります。(あなたの場合、これはエラーを無視することを意味する可能性があります。)

于 2012-01-11T21:17:19.960 に答える