丢失udp数据包,好的,但不是这样吗?

时间:2012-03-21 07:38:09

标签: c# udp udpclient

我原本试图编写一个小型控制台应用程序来在本地发送UDP数据包,因此我可以测试我的“接收器”应用程序。在这里搜索Stack Overflow,我设法得到了一些有用的东西。但它只能有时。我知道UDP是不可靠的,但在这种情况下,它要么完全有效,要么根本不起作用。

我试图将代码减少到绝对最小值。如果您将这两个代码块复制到两个不同控制台应用程序的main中并一起运行(在VS之外),我有兴趣知道是否:

  • 它适用于你:永远,永远或永远
  • 如果您发现任何差异取决于您首先开始/停止哪一个
  • 你知道什么是错的

如果我让Sender继续运行,并且停止/启动接收器十几次,它将进入一个不会收到任何东西的状态。如果你继续尝试,它会再次开始工作,然后停止,然后开始......

UdpReceiver

int port = 31572;
var udpReceiver = new UdpClient { ExclusiveAddressUse = false };
udpReceiver.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
var localEP = new IPEndPoint(IPAddress.Loopback, port);
udpReceiver.Client.Bind(localEP);
Task.Factory.StartNew(() =>
    {
        var inEndPoint = new IPEndPoint(IPAddress.Any, 0);
        while(true)
        {
            udpReceiver.Receive(ref inEndPoint);
            Console.Write(".");
        }
    });

Console.ReadKey(true);
udpReceiver.Close();

UdpSender

var port = 31572;
UdpClient udpSender = new UdpClient { ExclusiveAddressUse = false };
udpSender.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
var remoteEP = new IPEndPoint(IPAddress.Loopback, port);
udpSender.Client.Bind(remoteEP);
var data = new byte[500];
var rnd = new Random();
Task.Factory.StartNew(() =>
    {
        while(true)
        {
            Console.Write(".");
            rnd.NextBytes(data);
            udpSender.Send(data, data.Length, remoteEP);
            Thread.Sleep(1000);
        }
    });
Console.ReadKey(true);
udpSender.Close();

0 个答案:

没有答案