使用C#实时从服务器接收UDP流的正确方法

本文关键字:方法 UDP 实时 服务器 使用 | 更新日期: 2023-09-27 18:27:43

所以我正在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#实时从服务器接收UDP流的正确方法

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

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

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

    如果UDP数据包的接收是在一个单独的线程中完成的,请增加该线程的优先级,这是最重要的一个,将其设置为"时间关键优先级",否则,请减少处理接收到的数据的线程,将其设为"低于正常优先级"。最后,你说你"用收到的数据调用循环中的另一个方法",我认为这肯定有问题,你应该把数据放在队列中,进程线程会拾取它,但不要在接收中调用该方法,当然,不要每次收到数据包时都创建线程。