c# - La más simple posible publicitar/escuchar arreglos a través de sockets
udp uwp (1)
¿Qué pasa con la siguiente disposición simple? Todo lo que hago es crear un anunciante UDP que multidifunde un mensaje y un oyente que se una al grupo de multidifusión para recibir este mensaje, ambos ejecutándose en la misma máquina.
string Port = "54153";
HostName Host = new HostName("224.3.0.5"); //a multicast range address
//listener
var L = new DatagramSocket();
L.MessageReceived += (sender2, args) => { /*something*/ };
await L.BindServiceNameAsync(Port);
L.JoinMulticastGroup(Host);
//advertiser
var AdvertiserSocket = new DatagramSocket();
AdvertiserSocket.Control.MulticastOnly = true;
Stream outStream = (await AdvertiserSocket.GetOutputStreamAsync(Host, Port)).AsStreamForWrite();
using (var writer = new StreamWriter(outStream))
{
await writer.WriteLineAsync("MESSAGE");
await writer.FlushAsync();
}
El oyente no recibe nada ( MessageReceived
nunca se invoca). He intentado las siguientes variaciones sin éxito:
- Llamar y no llamar a BindServiceNameAsync () en el anunciante.
- Usar
MulticastOnly
en el anunciante, el oyente o ambos - Esperando unos segundos después de crear un objeto antes que el otro.
- Usando
255.255.255.255
como host.
Parece que el anunciante está difundiendo datos correctamente (TCPView muestra los paquetes enviados), pero el puerto receptor no obtiene nada.
Gracias por compartir este problema. Hice una demostración e hice algunas pruebas. Descubrí que el socket del oyente no recibirá ningún mensaje hasta que haya enviado un mensaje en el grupo.
Por lo tanto, actualmente la solución es enviar un mensaje vacío inmediatamente después de registrarse para escuchar:
private async void btnListen_Click(object sender, RoutedEventArgs e)
{
socket = new DatagramSocket();
socket.MessageReceived += Socket_MessageReceived;
socket.Control.MulticastOnly = true;
await socket.BindServiceNameAsync(serverPort);
socket.JoinMulticastGroup(serverHost);
SendWithExistingSocket(socket, "");//send an empty message immediately
}
private async void SendWithExistingSocket(DatagramSocket socket, String text)
{
if (socket != null)
{
Stream stream = (await socket.GetOutputStreamAsync(serverHost, serverPort)).AsStreamForWrite();
using (var writer = new StreamWriter(stream))
{
writer.WriteLine(text);
await writer.FlushAsync();
}
}
}
En cuanto a la causa raíz de este problema, consultaré con el equipo relacionado y le haré saber una vez que obtuve una respuesta.