2011-06-16 18 views
12

Estoy trabajando en un servidor de C++/aplicaciones de cliente .NET pareja en la que mi servidor (que ejecuta el C++ en Linux) transmite un mensaje para mostrar que está vivo para toda la red y mi programa .NET escucha paquetes y analiza para obtener el tiempo de actividad del servidor.¿Diseño de difusión de red UDP?

Como he leído, para enviar una transmisión UDP regular a la dirección de difusión, simplemente tengo que enviar un paquete a 192.168.0.255 (en mi caso 192.168.2.255) o 255.255.255.255. ¿Es esto correcto? ¿Puedo usar la misma dirección de puerto? ¿Hay otras necesidades?

Entiendo el hecho de que si mi programa .NET escucha en esa dirección particular, es posible recibir paquetes de otras aplicaciones aparte de mi programa de servidor C++. ¿Hay algún método de "firma" del paquete en el lado del servidor C++ para que mi programa .NET lea el encabezado del paquete y vea que es (casi) el que estoy buscando?

Respuesta

20

Sin importar el idioma que está utilizando, aquí está mi respuesta:

En cuanto a las direcciones IP de difusión, ambas direcciones son direcciones de difusión pero los enrutadores no reenviarán la dirección de difusión limitada (que es 255.255.255.255). Es mejor utilizar la dirección de difusión dirigida a la subred (192.168.2.255).

Para enviar/recibir una dirección de difusión, debe definir su dirección de difusión (dirección IP de difusión y número de puerto). Por ejemplo: 192.168.2.255 y número de puerto 3000. Las aplicaciones cliente (los remitentes) debe habilitar opción de socket SO_BROADCAST como sigue:

int enabled = 1; 
setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &enabled, sizeof(enabled)); 

donde sockfd es el descriptor de socket.

La aplicación de servidor escuchará en un número de puerto específico (puerto 3000). Normalmente, el servidor responderá a cada solicitud utilizando el mensaje de unidifusión.

No habrá conflicto mientras ninguna aplicación esté escuchando en el mismo número de puerto. Su servidor no se ejecutará si otra aplicación está escuchando en el mismo puerto a menos que haya habilitado la opción de socket SO_REUSEADDRESS. Sin embargo, si hay un conflicto, entonces su firma depende de su protocolo (formato de mensaje). Por lo tanto, verifique el formato del mensaje y rechace el mensaje si no sigue el formato del mensaje definido por su protocolo de aplicación.

Para las aplicaciones cliente, el paquete recibido es unicast (a menos que tenga otro diseño). Entonces, no hay conflicto en este lado.

+0

Entonces, básicamente, en el lado del cliente, ¿escucho el puerto x en la ip local? –

2

Si su programa .NET escucha el tráfico de difusión, recibirá todo el tráfico de difusión en la red enviada en ese puerto, incluido el tráfico no enviado por su servidor. Podría poner un "marcador" en la carga de los mensajes de difusión enviados por su servidor. De esta manera, su programa .NET podría distinguir cuáles le interesan.

Más allá de eso, recomendaría usar multicast en lugar de broadcast. El tráfico de difusión generalmente está restringido a hosts en la misma subred. En términos sencillos, si tiene un enrutador en su red, un host en el lado A del enrutador no verá el tráfico de difusión enviado por un host en el lado B (y viceversa) porque el enrutador lo "bloquea". Los enrutadores casi siempre reenviarán el tráfico de multidifusión si un host se ha unido al grupo de multidifusión.

7

También tiene que habilitar la opción de conector SO_BROADCAST en C++ para enviar el tráfico de difusión, o tendrá que obtener un permiso denegado error:

int broadcastPermission = 1; 
setsockopt(socketDescriptor, SOL_SOCKET, SO_BROADCAST, (void*)&broadcastPermission, sizeof(broadcastPermission)) 
Cuestiones relacionadas