2011-12-31 154 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