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

使用C#从服务器实时接收UDP流的正确方法?,c#,winforms,sockets,udp,udpclient,C#,Winforms,Sockets,Udp,Udpclient,因此,我正在用C语言编写一个程序,其中服务器不断地向我(客户机)发送UDP数据报。1个数据报将转换为1行消息。目前,我一直在无限循环中调用Recieve方法,如下所示: IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0); while (true) { Byte[] receiveBytes = receivingUdpClient.Receive(ref RemoteIpEndPoint); retu

因此,我正在用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。但这是接收发送给我的恒定流的正确方法吗?我注意到我收到的消息的频率与实际服务器设置的发送频率不同。谢谢你的帮助


干杯。

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

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

  • UDP:更适合于多个发送方通过同一端口向接收方发送数据。如果数据包完整性至关重要,则接收方应向发送方发送接收到的每个数据包的ACK(确认)数据包,如果发送方在合理时间内未接收到ACK数据包,则应重新发送该数据包,直到接收到适当的ACK 如果UDP数据包的接收是在一个单独的线程中完成的,则增加该线程的优先级,这是最重要的,将其设置为“时间关键优先级”,否则,减少处理接收到的数据的线程,将其设置为“低于正常优先级”。 最后,您说您“使用接收到的数据调用循环中的另一个方法”,我认为这肯定有问题,您应该将数据放入队列中,进程线程将拾取它,但不要在接收中调用该方法,当然,不要每次接收包时都创建线程


  • 你说频率不同是什么意思?你到底在看什么?非常感谢。回答得很好,正是我需要的。