2012-09-25 39 views
6

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.Recepción de mensaje de difusión UDP en C#

Tengo un dispositivo y una PC en la red de mi hogar. El dispositivo envía mensajes de difusión UDP. En mi PC puedo ver esos mensajes en Wireshark:

Fuente Destino Longitud

192.168.1.102 0.0.0.0 Puerto UDP 60 Fuente: 9050 Puerto de destino: 0

Eso significa que los paquetes llegan en mi ORDENADOR PERSONAL. 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. ¿Alguien puede ayudarme? ¡Gracias!

+1

¿Puedes publicar el código que estás usando para escuchar los paquetes? – tomasmcguinness

+0

Probé el código de: http://codeidol.com/csharp/csharp-network/IP-Multicasting/What-Is-Broadcasting/ y http://www.java2s.com/Code/CSharp/Network/ReceiveBroadcast. htm y también http://stackoverflow.com/questions/746519/udpclient-receive-on-broadcast-address – Boris

+0

¿algún firewall activo? No estoy seguro de dónde intercepta Wireshark los paquetes, pero podría ser que el firewall los detenga después – Default

Respuesta

0

Está 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 algún motivo.

Para solucionar esto: En Broadcst.cs transmitieron dos veces. una vez para el localhost y luego para la dirección IP de destino (iep2). simplemente elimine el

sock.SendTo(data, iep1); 

y debería funcionar.

No tengo idea de por qué.

1

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. Tiene que 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, siga leyendo.

La configuración de mi red es: la IP de mi máquina (receptora) era 192.168.1.2, la 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 (o menos) 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 funciona, a menos envié un paquete de difusión de ese socket antes de que llame ReceiveFrom en él. Es decir. añadiendo esta línea antes ReceiveFrom llamada:

sock.SendTo(someData, new IPEndPoint(IPAddress.Broadcast, somePort)) 

Cuando no haya enviado el paquete de difusión en primer lugar de la recepción de zócalo, los paquetes de difusión entrantes no fueron recibidos por ella, a pesar de que aparecieron en Wireshark (destino de los paquetes era 255.255. 255.255). Creo que parece que el firewall 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 paquetes de difusión de alguna manera), Fui a los servicios y desactivé por completo el servicio de firewall de Windows. 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!

Cuestiones relacionadas