0

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

干杯。

4

1 回答 1

2

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

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

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

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

于 2013-08-15T16:10:41.543 回答