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?

¿Fue útil?

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):

  1. sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
    • Abra el zócalo
  2. setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &1)
    • Permite la transmisión entrante y saliente desde este socket
  3. 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().

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top