【问题标题】:Correct way to receive UDP stream from server in real-time with C#?使用 C# 从服务器实时接收 UDP 流的正确方法?
【发布时间】:2013-08-15 14:16:18
【问题描述】:

所以我正在用 C# 编写一个程序,其中服务器不断向我(客户端)发送 UDP 数据报。 1 个数据报将转换为 1 行消息。目前我一直在无限循环中调用 Recieve 方法,如下所示:

IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);
while (true)
{
     Byte[] receiveBytes = receivingUdpClient.Receive(ref RemoteIpEndPoint);
     returnData = Encoding.ASCII.GetString(receiveBytes);
}

我在循环中调用另一个方法来处理另一个线程中的 returnData。但这是接收发送给我的恒定流的正确方法吗?我注意到我收到的消息频率与实际服务器设置的发送频率不同。感谢您的帮助!

干杯。

【问题讨论】:

  • 频率不同是什么意思?你到底看到了什么?

标签: c# winforms sockets udp udpclient


【解决方案1】:

UDP 是面向无连接的协议,这意味着接收到的数据包可能与发送的顺序不同;在没有任何信息或提示的情况下,数据包也可能丢失。如果您需要确保收到所有数据包,您有 2 个主要选项:

  1. TCP:使用 TCP 作为要使用的协议,如果连接是一对一(服务器)到一(客户端),那么它是一个更好的选择。 TCP 提供所有必要的安全性、CRC 和握手以保持数据完整性,它就像一个流,当无法发送更多数据时,它会阻塞发送方,直到读取方读取缓冲的数据。

  2. UDP:更适合多个发送方通过同一端口向接收方发送数据的情况。如果数据包的完整性至关重要,那么接收方应该为每个收到的数据包发送一个 ACK​​(确认)数据包给发送方,如果发送方在合理的时间内没有收到 ACK 数据包,那么它应该重新发送数据包,直到收到适当的 ACK。

    如果UDP数据包的接收是在一个单独的线程中完成的,增加这个线程的优先级,它是最重要的,设置为“Time-Critical优先级”,否则,减少处理接收到的数据的线程,把它放在“下面- 正常优先级”。 最后,你说你“用接收到的数据在循环中调用另一个方法”,我认为这一定有问题,你应该把数据放在一个队列中,进程线程会捡起来,但不要调用接收中的方法,当然,不要在每次收到数据包时创建一个线程。

【讨论】:

  • 非常感谢。很好的答案,正是我需要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多