2011-12-31 209 views
1

如果socket.ReceiveFrom (byte [] message, EndPoint endPoint)用於在綁定的UDP套接字上接收數據,並且沒有收到數據會發生什麼情況?它是否繼續等待數據到達或繼續?我特別談論UDP數據報。C#中的UDP套接字?

+0

有一個超時選項:'Socket.ReceiveTimeout',例如:'socket.ReceiveTimeout = 1000;' – 2011-12-31 05:22:43

+0

@ M.Babcock感謝您的回答。所以我需要基本上設置接收超時 - 如果超過超時它會自動繼續?那是對的嗎?你確定這也適用於UDP套接字嗎? – fdh 2011-12-31 05:32:36

+0

如果超時過期,則不會產生您需要處理的異常。我在使用套接字異步時(這可能是由我在接收時進行的大量工作導致的)導致數據包丟失,所以在我的情況下,我必須實現超時並以超時的方式同步處理請求,以終止偵聽線程。你的里程我有所不同。 – 2011-12-31 05:42:30

回答

1

如果目標是迫使你的插座停止後X號聽秒,所以你可以做別的事情(比如檢查應用程序是否正在關閉),並且你正在使用同步套接字,那麼我會建議將Socket.ReceiveTimeout設置爲X秒數(因爲Socket.ReceiveTimeout以毫秒爲單位的時間數爲1000),然後捕獲造成超時時引發的異常。

2

它會等待數據。如果這種行爲不夠好,可以使用異步接收。也使用UDPClient。不需要使用Socket本身。

如果沒有數據可用於閱讀,ReceiveFrom方法將阻塞,直到數據可用

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

+0

-1:如果您不推薦'UDPClient',不知道它們是什麼?絕對有些情況下,你可以使用自己的'Socket'。 – 2011-12-31 05:23:57

+0

我不是說每件事都使用UDPClient。如果你需要的話,最好用Socket連接UDP。 – 2011-12-31 05:25:52

+0

從http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.receivetimeout.aspx:此選項僅適用於同步接收呼叫。如果超時超時,Receive方法將拋出一個SocketException.'所以不管你的回答是不正確的。 – 2011-12-31 05:28:23