【问题标题】:UDP Sockets in C#?C#中的UDP套接字?
【发布时间】:2012-01-30 23:14:32
【问题描述】:

如果socket.ReceiveFrom (byte [] message, EndPoint endPoint) 用于在绑定的 UDP 套接字上接收数据,但没有接收到数据,会发生什么?它是继续等待数据到达还是继续?我说的是 UDP 数据报。

【问题讨论】:

  • 有一个超时选项:Socket.ReceiveTimeout,例如:socket.ReceiveTimeout = 1000;
  • @M.Babcock 感谢您的回答。所以我需要基本上设置接收超时 - 如果它超过超时它会自动移动?那是对的吗?你确定这也适用于 UDP 套接字吗?
  • 否,如果超时到期,则会引发您需要处理的异常。我在使用套接字异步时遇到了丢包(这可能是由于我在接收时所做的大量工作造成的),所以在我的情况下,我必须实现超时并与超时同步处理请求以终止侦听线程。您的里程数因人而异。
  • 您确定这适用于 UDP 套接字吗?因为您说“接收”是 TCP 而不是 UDP。这就是我基本上在做的事情:我听 10 秒钟的信息。如果我得到信息,我调用函数 a,但如果我没有,我调用函数 b。你知道我会怎么做吗?我可以将 ReceiveTimeout 设置为 10 秒,然后调用 ReceiveFrom() 吗?
  • 接收适用于 TCP 和 UDP,它是使用 UDP 时丢失的连接。

标签: c# sockets udp datagram


【解决方案1】:

如果目标是强制您的套接字在 X 秒后停止侦听,以便您可以执行其他操作(例如检查应用程序是否正在关闭)并且您正在使用同步套接字,那么我建议您设置 @987654321 @ 到 X 秒数(自 Socket.ReceiveTimeout 以来的 1000 次以毫秒为单位),然后捕获在超时时引发的结果异常。

【讨论】:

    【解决方案2】:

    它将等待数据。如果此行为不够好,您可以使用异步接收。也使用 UDPClient。 Socket 本身不需要滚动。

    如果没有数据可供读取,ReceiveFrom 方法将阻塞直到数据可用

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

    【讨论】:

    • -1:不了解他们是什么之后你怎么能推荐UDPClient?在某些情况下,推出自己的Socket 是有意义的。
    • 我并不是说对所有事情都使用 UDPClient。如果您需要的话,最好使用 Socket 手动连接 UDP。
    • From msdn.microsoft.com/en-us/library/…: This option applies to synchronous Receive calls only. If the time-out period is exceeded, the Receive method will throw a SocketException. 所以不管你的答案是错误的。
    • 不,这仅适用于 Recieve - 仅 TCP 套接字。我认为超时不会影响 RecieveFrom。
    • Herp 我特别需要使用套接字,因为 UDPClient 无法为我提供对程序的足够控制。
    猜你喜欢
    • 2010-12-22
    • 2015-12-14
    • 1970-01-01
    • 2018-04-03
    • 2017-10-28
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多