¿Transmisión y unidifusión UDP a través del mismo socket?
Pregunta
Tengo una aplicación de Linux que abre un socket UDP y lo vincula a un puerto. No he tenido ningún problema al enviar paquetes de unidifusión a través del socket. Tuve la ocasión de enviar un paquete de difusión, por lo que habilité SO_BROADCAST, que permitió que los paquetes de difusión pasaran, pero luego noté que los paquetes de unidifusión también se transmitían. ¿Es este comportamiento esperado para un socket UDP, o es más probable que haya configurado mal algo?
Solución
Por lo que entiendo, SO_BROADCAST es una opción de socket. Entonces, si lo habilita en su socket, este se transmitirá. Supongo que tendrá que abrir diferentes sockets si desea hacer unicast y transmitir desde el mismo código.
Otros consejos
No he hecho mucha programación práctica aquí, pero probablemente necesite proporcionar más información sobre la biblioteca, la versión del sistema operativo, el código, etc. ¿Quizás una muestra de código?
Si recuerdo los libros que leí, si configura el marcador en el socket, eso afectará a todos los datagramas enviados desde el socket, porque el socket es básicamente una estructura de datos de banderas de red + un descriptor de archivo.
He descubierto el mismo problema en Linux sobre tener un socket unicast y transmitir al mismo tiempo. Resolví el problema de la siguiente manera (pseudocódigo):
-
sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
- Abra el zócalo
-
setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &1)
- Permite la transmisión entrante y saliente desde este socket
-
bind(sock, bindaddr, sizeof(struct sockaddr)
con
bindaddr.sin_family = AF_INET
bindaddr.sin_port = <YourPort>
bindaddr.sin_addr.s_addr = INADDR_ANY
- Obtenga todos los mensajes entrantes en cualquier tarjeta para
<YourPort>
La advertencia es que no hay filtrado (ver advertencia en 3.). Entonces recibirás todos los mensajes.
Los mensajes enviados no son emitidos ni emitidos en la dirección dada en sendto()
.