C# UDP Socket.ReceiveFrom () прерывает l oop без исключения - PullRequest
0 голосов
/ 16 февраля 2020

Я пытаюсь создать игру с использованием сокетов и UDP, я создал серверный класс, где при вызове метода start я запускаю задачу с помощью al oop для получения пакетов и их обработки, я использовал Socket.ReceiveFrom(packet, ref sender); внутри блок try catch со всем внутри некоторое время l oop, сначала я забыл добавить Socket.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 25000));, поэтому я получил все oop исключений связывания, что нормально, но теперь, когда я добавил эту строку, моя программа волнуется, см. код ниже

    public class UDPServer
    {
        public UDPServer()
        {
            Socket = new Socket(AddressFamily.InterNetwork ,SocketType.Dgram,ProtocolType.Udp);
            Socket.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 25000));
        }

        public void Start()
        {
            IsBound = true;

            try
            {
                Task.Run(NetworkLoop);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        private void NetworkLoop()
        {
            EndPoint sender = new IPEndPoint(IPAddress.Any, 0);
            byte[] packet = new byte[1];
            int dataSize = 0;

            while (IsBound)
            {
                try
                {
                    dataSize = Socket.ReceiveFrom(packet, ref sender);
                    Console.WriteLine(sender.ToString() + " with " + packet.Length + " of " + dataSize);
                }
                catch (Exception e)
                {
                    Console.WriteLine("Reading exeption : " + e.Message);
                }
            }
        }
    }

Я отладил это, и теперь кажется, что при пошаговом переходе к строке dataSize = Socket.ReceiveFrom(packet, ref sender); он просто выходит из блока try catch без каких-либо исключений и прерывает l oop. ..

Это нормальное поведение?

1 Ответ

0 голосов
/ 16 февраля 2020

Ваш метод UDPServer.Start() не блокируется, потому что Task.Run будет работать асинхронно.

Task.Run(NetworkLoop); // This is non-blocking

Ваш UDP-сервер будет работать либо:

Task.Run(NetworkLoop).Wait(); // This is blocking

или

new UDPServer().Start();

Console.WriteLine("Press <enter> key to stop UDP server...");
Console.ReadLine(); // This block until user hit <enter> key
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...