Подтвердить что ты не робот

Постоянно получать сообщения с помощью udpClient

Я искал лучшее решение для приема и обработки сообщений через класс UdpClient в C#. У кого-нибудь есть решения для этого?

4b9b3361

Ответ 1

Попробуйте этот код:

//Client uses as receive udp client
UdpClient Client = new UdpClient(Port);

try
{
     Client.BeginReceive(new AsyncCallback(recv), null);
}
catch(Exception e)
{
     MessageBox.Show(e.ToString());
}

//CallBack
private void recv(IAsyncResult res)
{
    IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 8000);
    byte[] received = Client.EndReceive(res, ref RemoteIpEndPoint);

    //Process codes

    MessageBox.Show(Encoding.UTF8.GetString(received));
    Client.BeginReceive(new AsyncCallback(recv), null);
}

Ответ 2

Для новых методов с использованием TAP вместо метода Begin/End вы можете использовать следующее в .Net 4.5

Довольно просто!

Асинхронный метод

    private static void UDPListener()
    {
        Task.Run(async () =>
        {
            using (var udpClient = new UdpClient(11000))
            {
                string loggingEvent = "";
                while (true)
                {
                    //IPEndPoint object will allow us to read datagrams sent from any source.
                    var receivedResults = await udpClient.ReceiveAsync();
                    loggingEvent += Encoding.ASCII.GetString(receivedResults.Buffer);
                }
            }
        });
    }

Синхронный метод

Как показано выше в методе asynchronous, это также можно реализовать в методе synchronous очень похожим образом:

    private static void UDPListener()
    {
        Task.Run(() =>
        {
            using (var udpClient = new UdpClient(11000))
            {
                string loggingEvent = "";
                while (true)
                {
                    //IPEndPoint object will allow us to read datagrams sent from any source.
                    var remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);
                    var receivedResults = udpClient.Receive(ref remoteEndPoint);
                    loggingEvent += Encoding.ASCII.GetString(receivedResults);
                }
            }
        });
    }

Ответ 3

Я могу порекомендовать две ссылки об этом решении, которые были полезны для меня.

ПК по теме

Переполнение стека

Первое из них - очень простое решение, но будьте осторожны при модификации, потому что постоянный прием будет работать только в том случае, если некоторый пакет UDP отправляется сначала на устройство "remote". Для непрерывного прослушивания добавьте строку кода "udp.BeginReceive(новый AsyncCallback (UDP_IncomingData), udp_ep); после каждого считывания входящих данных, чтобы включить новый прием пакетов UDP.

Второй вариант - хорошее решение для использования IP-адресов многоадресной передачи (239.255.255.255 - 240.0.0.0)