Enviar respuesta para transmitir con un zócalo
-
11-09-2019 - |
Pregunta
Estoy intentando enviar una difusión y luego dejar que la respuesta del servidor a la misma:
public static void SendBroadcast()
{
byte[] buffer = new byte[1024];
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);
socket.Connect(new IPEndPoint(IPAddress.Broadcast, 16789));
socket.Send(System.Text.UTF8Encoding.UTF8.GetBytes("Anyone out there?"));
var ep = socket.LocalEndPoint;
socket.Close();
socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
socket.Bind(ep);
socket.Receive(buffer);
var data = UTF8Encoding.UTF8.GetString(buffer);
Console.WriteLine("Got reply: " + data);
socket.Close();
}
public static void ReceiveBroadcast()
{
byte[] buffer = new byte[1024];
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
var iep = new IPEndPoint(IPAddress.Any, 16789);
socket.Bind(iep);
var ep = iep as EndPoint;
socket.ReceiveFrom(buffer, ref ep);
var data = Encoding.UTF8.GetString(buffer);
Console.WriteLine("Received broadcast: " + data + " from: " + ep.ToString());
buffer = UTF8Encoding.UTF8.GetBytes("Yeah me!");
socket.SendTo(buffer, ep);
socket.Close();
}
La emisión llega bien, pero la respuesta no lo hace. Sin excepción. ¿Alguien puede ayudarme? ¿Tengo que abrir una nueva conexión para la respuesta o algo?
EDITAR: Se ha cambiado mi código un poco, y ahora funciona! Gracias por su respuesta!
Solución
No se ve como su zócalo del SendBroadcast()
está ligado a un puerto por lo que no va a recibir nada. De hecho, su toma de ReceiveBroadcast()
es el envío de la respuesta de vuelta a su propio puerto por lo que va a recibir su propia respuesta.
ReceiveBroadcast: binds to port 16789
SendBroadcast: sends to port 16789
ReceiveBroadcast: receives datagram on port 16789
ReceiveBroadcast: sends reply to 16789
ReceiveBroadcast: **would receive own datagram if SendTo follwed by Receive**
Es necesario que (a) hayan SendBroadcast()
enlace a un puerto diferente y cambiar ReceiveBroadcast()
enviar a ese puerto (en lugar de su propia ep
punto final), o (b) tener ambas funciones utilizar el mismo socket objeto para que puedan ambos recibir datagramas en el puerto 16789.