2017-12-12 16 views
0

私はちょうど.Net(Core 2)のUDPClientで作業を始めました。受信時に実際に「リモート接続がクローズされました」という例外がスローされることに気付きました。 UDPはリモートを気にしないので、これはあまり意味がありません。なぜUDPソケットのリモートクローズド接続例外がありますか?

私はアプリケーションからUDPデータを受け取ります。私は制御できません。私は短期でやっていることはこれです:

if(MyUDPClient.Available > 0) 
{ 
    IPEndPoint Point = null; 
    Byte[] Data = MyUDPClient.Receive(ref point); 
    //[do something with data] 
} 

ただしの存続期間中に(私はデータを受信しながら、上記のループで行われます)アプリケーションと、受信するための呼び出しは、リモートが閉じられた例外をスローすることができます接続(それはなかった...)。

なぜこの例外は何か、そしておそらく回避策であると私は説明できますか?私が望むのは、データを受信して​​、それがオリジンドしたエンドポイントを特定することだけです。

+0

最小コードサンプルを入力してください。 MyUDPClientの初期化方法を見ずに、問題の内容を推測することしかできません。デフォルトのコンストラクタを使用してMyUDPClientを構築した可能性があります。つまり、ローカルポート/ローカルエンドポイントを指定していません。この場合、MyUDPClient.Availableは使用可能なデータを検索する場所がわからないため失敗します。しかし、あなたは正しいですが、リモコンが接続を閉じたという例外は非常に誤解を招きます。おそらくUDPClientがローカルポートにバインドされていないことを意味します。 – Xaver

+0

UDPソケットは、ソケットを閉じたエンドポイントにデータを送信しようとした後、このエラーをスローすることがわかりました。あなたのUDPSocketは読み込むデータを持っているかもしれませんが、最後のsendが成功しなかったので例外がスローされます。 Control-Flagではこれを無視できます。私は答えを追加します。 –

答えて

0

少し深く掘り下げた後、私はそれを説明するstackoverflowで別の答えを見つけました。 Source Answer
短く: UDPClient.Sendが失敗すると、リモートがソケットを閉じたため、次の受信(データがある場合でも、利用可能な理由は> 0)が例外をトリガーします。設定するコントロールフラグがあり、これを無視することができます。結局のところ、私はリモコンを気にしないので、私はremotemachineからの "到達不能"な反応に気にしません。

var udpClient = new UdpClient(); 
uint IOC_IN = 0x80000000; 
uint IOC_VENDOR = 0x18000000; 
uint SIO_UDP_CONNRESET = IOC_IN | IOC_VENDOR | 12; 
udpClient.Client.IOControl((int)SIO_UDP_CONNRESET, new byte[] { Convert.ToByte(false) }, null); 
関連する問題