configurar - ¿Cómo hacer una multidifusión UDP a través de la red local en c#?
multicast ip address (3)
Estoy tratando de que funcione una comunicación UDP simple en mi red local.
Todo lo que quiero hacer es hacer una multidifusión a todas las máquinas de la red
Aquí está mi código de envío
public void SendMessage(string message)
{
var data = Encoding.Default.GetBytes(message);
using (var udpClient = new UdpClient(AddressFamily.InterNetwork))
{
var address = IPAddress.Parse("224.100.0.1");
var ipEndPoint = new IPEndPoint(address, 8088);
udpClient.JoinMulticastGroup(address);
udpClient.Send(data, data.Length, ipEndPoint);
udpClient.Close();
}
}
y aquí está mi código de recepción
public void Start()
{
udpClient = new UdpClient(8088);
udpClient.JoinMulticastGroup(IPAddress.Parse("224.100.0.1"), 50);
receiveThread = new Thread(Receive);
receiveThread.Start();
}
public void Receive()
{
while (true)
{
var ipEndPoint = new IPEndPoint(IPAddress.Any, 0);
var data = udpClient.Receive(ref ipEndPoint);
Message = Encoding.Default.GetString(data);
// Raise the AfterReceive event
if (AfterReceive != null)
{
AfterReceive(this, new EventArgs());
}
}
}
Funciona perfectamente en mi máquina local pero no a través de la red.
-No parece ser el cortafuegos. Lo deshabilité en ambas máquinas y aún así no funcionó.
- Funciona si hago un envío directo a la dirección IP codificada de la máquina cliente (es decir, no multidifusión).
Cualquier ayuda sería apreciada.
¿Su hardware de red local es compatible con IGMP ?
Es posible que su conmutador tenga conocimiento de multidifusión, pero si IGMP está desactivado, no se dará cuenta si algún hardware conectado se suscribe a un grupo de multidifusión en particular para que no reenvíe esos paquetes.
Para probar esto, conecte temporalmente dos máquinas directamente con un cable cruzado. Eso debería (AFAICR) siempre funcionar.
Además, debería ser la mitad del código del servidor que tiene el argumento TTL suministrado a JoinMulticastGroup()
, no la mitad del cliente.
No puedo ver un TTL especificado en ninguna parte del código. Recuerde que TTL originalmente estaba destinado a estar en unidades de segundos, pero se ha convertido en unidades de saltos. Esto significa que al usar un TTL inteligente podría eliminar el paso por el enrutador. El TTL predeterminado en mi máquina es 32; creo que debería ser más que adecuado; pero el suyo en realidad puede ser diferente (UdpClient.Ttl) si su sistema ha pasado por algún tipo de bloqueo de seguridad.
No puedo recomendar el TTL que necesita, ya que personalmente necesito hacer mucha experimentación.
Si eso no funciona, puedes echar un vistazo a estos artículos:
En general, parece que ha habido éxito con el uso de Sockets y no UdpClients.
El grupo de multidifusión elegido también podría ser solo local. Prueba otro.
Su capa de red física también podría estar causando problemas. Me atrevo a cuestionar los switches y las conexiones directas (x-over). Hubs y todos los más inteligentes deberían manejarlos bien. Sin embargo, no tengo literatura que respalde eso.
Acabo de pasar 4 horas en algo similar (creo), la solución para mí fue:
client.Client.Bind(new IPEndPoint(IPAddress.Any, SSDP_PORT));
client.JoinMulticastGroup(SSDP_IP,IP.ExternalIPAddresses.First());
client.MulticastLoopback = true;
Usar una dirección IP específica (primera externa) en el grupo de multidifusión.