web-dev-qa-db-fra.com

Recevez des messages en continu à l'aide d'udpClient

Je cherchais la meilleure solution pour recevoir et traiter les messages via la classe UdpClient dans C#. Quelqu'un at-il des solutions pour cela?

22
Saanch

Essayez ce code:

//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);
}
40
Hossein Mobasher

Pour les méthodes plus récentes utilisant TAP au lieu de la méthode Begin/End, vous pouvez utiliser ce qui suit dans .Net 4.5

Assez facile!

Méthode asynchrone

    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);
                }
            }
        });
    }

Méthode synchrone

Comme pour la méthode asynchronous ci-dessus, cela peut également être implémenté dans la méthode synchronous d'une manière très similaire:

    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);
                }
            }
        });
    }
17
Mehrad

Je peux recommander deux liens sur cette solution qui m'ont été utiles.

lié au PC

Débordement de pile

Le premier est une solution vraiment facile mais soyez prudent lors de la modification car la réception continue ne fonctionnera que si certains paquets UDP sont envoyés en premier au périphérique "distant". Pour une écoute continue, ajoutez la ligne de code "udp.BeginReceive (new AsyncCallback (UDP_IncomingData), udp_ep);" après chaque lecture des données entrantes pour permettre une nouvelle réception des paquets UDP.

La seconde est une solution intéressante pour utiliser les adresses IP de multidiffusion (239.255.255.255 - 240.0.0.0)

0
RaKa