Потеря пакетов udp, хорошо, но не так? - PullRequest
0 голосов
/ 21 марта 2012

Первоначально я пытался написать небольшое консольное приложение для локальной отправки UDP-пакетов, чтобы я мог протестировать свое приложение-получатель.Ища здесь на Переполнении Стека, мне удалось получить кое-что, что работало.Но это работает только иногда .Я знаю, что UDP ненадежен, но в этом случае он либо полностью работает, либо не работает вообще.

Я пытался сократить код до абсолютного минимума.Если вы скопируете эти два блока кода в main двух разных консольных приложений и запустите их вместе (вне VS), мне было бы интересно узнать, работает ли:

  • для вас:когда-либо, никогда или все время
  • если вы видите какую-либо разницу в зависимости от того, что вы запускаете / останавливаете первым
  • у вас есть какие-либо идеи, что не такЯ оставляю Отправителя включенным и останавливаю / запускаю Приемник дюжину раз, он переходит в состояние, когда он ничего не получает.Если вы продолжите попытки, он снова начинает работать, затем останавливается, а затем начинает ...

    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();
    
...