Recepción de mensaje de difusión UDP en C#
broadcast wireshark (2)
Sé que esta pregunta se ha hecho muchas veces. He leído TODAS las respuestas y he probado una pieza de código que pude encontrar. Después de unos días estoy tan desesperado que tengo que pedirte ayuda.
Tengo un dispositivo y una PC en mi red doméstica. El dispositivo envía mensajes de difusión UDP. En mi PC puedo ver esos mensajes en wireshark:
Longitud del destino de la fuente
192.168.1.102 0.0.0.0 UDP 60 Puerto de origen: 9050 Puerto de destino: 0
Eso significa que los paquetes están llegando a mi PC. Mi próximo paso fue crear una aplicación C # que reciba esos paquetes. Como mencioné anteriormente, probé todas las soluciones posibles, pero simplemente no recibiré nada.
Así que supongo que debe haber algo muy básico que estoy haciendo mal. ¿Puede alguien ayudarme? ¡Gracias!
Estás bien, tienen algo conectado en el código que causa el problema. (No he leído el artículo, solo copiado pegado)
Siempre funciona desde la máquina local, pero desde una máquina remota fallará por alguna razón.
Para solucionar esto: en Broadcst.cs transmiten dos veces. una vez para el localhost y luego para la dirección IP de destino (iep2). simplemente elimina el
sock.SendTo(data, iep1);
y debería funcionar
No tengo idea por qué.
Acabo de experimentar el mismo problema, y quería compartir lo que lo solucionó.
En pocas palabras: parece que Windows Firewall fue de alguna manera la causa de este comportamiento extraño, y simplemente deshabilitar el servicio no ayuda. Debe permitir explícitamente paquetes UDP entrantes para un programa específico (ejecutable) en la lista de reglas de entrada de Firewall de Windows.
Para la descripción completa del caso, sigue leyendo.
Mi configuración de red es: la dirección IP de mi máquina (receptora) era 192.168.1.2, la dirección IP de la máquina que enviaba era 192.168.1.50, y la máscara de subred en ambas máquinas era 255.255.255.0. Mi máquina ejecuta Windows 7 x64.
Este es el código (aproximadamente) que utilicé:
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPEndPoint iep = new IPEndPoint(IPAddress.Any, 0);
sock.Bind(iep);
sock.EnableBroadcast = true;
EndPoint ep = (EndPoint)iep;
byte[] buffer = new byte[1000];
sock.ReceiveFrom(buffer, ref ep);
Inicialmente, esto no funcionó a menos que enviara un paquete de difusión desde ese socket antes de llamar a ReceiveFrom
en él. Es decir, agregar esta línea antes de la llamada de ReceiveFrom
:
sock.SendTo(someData, new IPEndPoint(IPAddress.Broadcast, somePort))
Cuando no envié el paquete de difusión primero desde el socket receptor, los paquetes de difusión entrantes no fueron recibidos por él, a pesar de que aparecían en Wireshark (el destino de los paquetes era 255.255.255.255).
Pensé que parece que el cortafuegos está jugando con paquetes entrantes (a menos que algún tipo de agujero UDP se abra primero por paquete saliente, aunque no he oído antes que la perforación UDP se aplique a los paquetes de difusión de alguna manera), así que fui a los servicios y desactiva el servicio de firewall de Windows por completo. Esto no cambió nada.
Sin embargo, después de probar todo lo demás, volví a habilitar el servicio de firewall e intenté ejecutar el programa nuevamente. Esta vez, el mensaje del firewall apareció preguntándome si quería permitir el proceso MyProgram.vshost.exe (estaba depurando en Visual Studio) a través del firewall, lo acepté y listo, ¡todo funcionó! ¡Los paquetes entrantes se estaban recibiendo ahora!