2012-09-04 30 views
6

al configurar un conector mediante dgram.createSocket('udp4'); y no vinculante a un puerto específico que hago recibir paquetes transmitidos que fueron enviadas a 255.255.255.255 Pero cuando estoy de unión a la misma toma de la dirección IP específica de mi interfaz this.server.bind(67, host); NO recibiré estos paquetes emitidos. ¿Es este un comportamiento normal?recibir paquetes transmitidos cuando se escucha a un puerto específico

Respuesta

4

El Javadoc for java.net.DatagramSocket dice:

Para recibir paquetes de difusión de un DatagramSocket debe estar sujeta a la dirección de comodín. En algunas implementaciones, los paquetes de difusión también se pueden recibir cuando un DatagramSocket está vinculado a una dirección más específica .

Esta es una indicación bastante clara de que el comportamiento depende de la plataforma, por lo que los conectores Javascript se verán afectados de la misma manera.

De acuerdo con mis pruebas, Windows Vista 64 no se comporta como se describe en la segunda oración (es decir, no recibe difusiones a menos que esté vinculado a INADDR_ANY).

+0

-1 ya que esta pregunta no tiene nada que ver con Java. –

+2

@RobRaisch Y un feliz -1 para ti también.Si hubiera leído mi respuesta correctamente, habría visto que estaba citando el Javadoc * como evidencia de que el comportamiento depende de la plataforma, * y que, por lo tanto, también afecta a Javascript, y de hecho a todos los demás idiomas por igual. Es una pena que no lo entendieras la primera vez. – EJP

2

Sí, este es el comportamiento esperado porque, sin un puerto o interfaz, dgram.createSocket() hará lo siguiente:

se unen a la dirección de "todas las interfaces" en un puerto aleatorio (lo hace la derecha cosa para ambos sockets udp4 y udp6).

- Del dgram API documentation en nodejs.org

que le permite capturar los paquetes de difusión a cualquier puerto en cualquier interfaz disponible.

Al probar tanto una interfaz como un puerto para createSocket(), se limita a capturar únicamente paquetes que se han transmitido a la red vinculada a la interfaz especificada en el puerto especificado.

Debe tener en cuenta que para recibir transmisiones a una interfaz específica, deberán enviarse a la dirección de difusión en/para la red a la que sirve esa interfaz.

Así que si la red es:

10.1.1.0 

con una máscara de red de:

255.255.255.252 

que es también:

10.1.1.0/29 (CIDR notation) 

la dirección de difusión correcta es:

10.1.1.7 

Dada su dirección de red y máscara de red, "Network and IP address calculator" de tuxgraphics.org es una herramienta que puede utilizar para identificar la dirección de difusión correcta para su red específica.

+1

El comportamiento depende de la plataforma en realidad. Véase, por ejemplo, Stevens, Fenner y Rudolf, * Programación en red de Unix, * Vol I, 3a edición, p. 532, y # 3.3.6 de RFC 1192 que 'no toma posición' sobre el tema. – EJP

Cuestiones relacionadas