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?
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);
}
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!
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);
}
}
});
}
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);
}
}
});
}
Je peux recommander deux liens sur cette solution qui m'ont été utiles.
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)