Я искал лучшее решение для приема и обработки сообщений через класс UdpClient
в C#
. У кого-нибудь есть решения для этого?
Постоянно получать сообщения с помощью udpClient
Ответ 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)