2011-12-31 29 views
1

バインドされたUDPソケットでデータを受信するためにsocket.ReceiveFrom (byte [] message, EndPoint endPoint)が使用され、何のデータも受信されない場合はどうなりますか?データが到着するのを待っていますか、それとも続行しますか?私は特にUDPデータグラムについて話しています。C#のUDPソケット?

+0

タイムアウトオプションがあります: 'Socket.ReceiveTimeout'、例:' socket.ReceiveTimeout = 1000; ' –

+0

@ M.Babcock回答ありがとうございます。だから私は基本的に受信タイムアウトを設定する必要があります - それは自動的に移動タイムアウトを超えている場合?あれは正しいですか?そしてこれはUDPソケットにも当てはまりますか? – fdh

+0

タイムアウトが期限切れになると、処理する必要がある例外が発生します。私はソケット非同期を使用しているときにパケットロスを経験しました。これはおそらく私が受信した集中的な作業に起因していました。私の状況では、タイムアウトを実装して、要求を同期してリッスンスレッドを強制終了する必要がありました。あなたのマイレージは変わります。 –

答えて

1

目標は、X番号の後に聞いて停止するように、あなたのソケットを強制する場合には(アプリケーションがシャットダウンしているかどうかを確認するなど)、同期ソケットを使用している場合は、Socket.ReceiveTimeoutをX秒(1000秒に換算すると1000回)に設定することをお勧めします。結果としてタイムアウト時に発生する例外。

2

データを待つ。この動作が十分でない場合は、非同期受信を使用できます。 UDPClientも使用します。 Socket自体でロールする必要はありません。データが読み取りに利用できない場合、データが使用可能になるまで

、ReceiveFromメソッドはブロックします

出典:http://msdn.microsoft.com/en-us/library/aa329728%28v=vs.71%29.aspx

+0

-1: 'UDPClient'をどうやってお勧めしますか?あなた自身の 'Socket'を動かすことが理にかなっている状況が絶対にあります。 –

+0

私はすべてのためにUDPClientを使用すると言っているわけではありません。あなたが必要とするものがあれば、ソケットでUDPを配線する方が良いでしょう。 –

+0

http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.receivetimeout.aspx: 'このオプションは同期受信呼び出しにのみ適用されます。タイムアウト時間を超えると、ReceiveメソッドはSocketExceptionをスローします.'したがって、あなたの答えは間違っています。 –

関連する問題