使用C#实时接收来自服务器的UDP流的方法?

时间:2013-08-15 14:16:18

标签: 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);
     returnData = Encoding.ASCII.GetString(receiveBytes);
}

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

干杯。

1 个答案:

答案 0 :(得分:0)

UDP是面向无连接的协议,这意味着收到的数据包可能不是按照它们发送的顺序;如果没有任何关于该事实的信息或暗示,数据包也可能丢失。如果您需要确保收到所有数据包,则有2个主要选项:

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

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

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