c++ - ¿Cómo encontrar la dirección de destino de un paquete UDP usando boost:: asio?
networking boost-asio (1)
Estoy desarrollando una red de comunicaciones punto a punto para su uso a través de una LAN en un entorno industrial. Algunos mensajes son simplemente asincrónicos y no requieren una respuesta. Otros son solicitud-respuesta. Los mensajes de solicitud (y los mensajes asíncronos) se envían a un grupo de multidifusión y las respuestas a las solicitudes se envían unidifusión. Cada punto extremo, por lo tanto, recibe paquetes UDP que se envían al grupo de multidifusión y también recibe mensajes que se le envían utilizando unidifusión simple.
Hasta ahora funciona bien, pero no parece haber ninguna manera en boost :: asio para averiguar la dirección de destino de un paquete UDP recibido (usando socket.async_receive_from), ya sea que se haya enviado al grupo multicast o al real interfaz. Puedo usar el contenido del mensaje para inferir si se envió por multidifusión o unidifusión, pero sería bueno poder también verificar la dirección de destino.
Actualmente estamos usando Windows 7, pero estaremos en transición a Linux en el futuro.
¿Hay alguna manera de encontrar la dirección de destino de un paquete UDP recibido usando boost :: asio?
Lamentablemente, esto no es posible con boost :: asio, y generalmente no es "la forma de hacerlo", ya que intenta acceder a la información de la capa de transporte en la capa de aplicación .
Entonces básicamente tienes dos opciones:
a) Escriba un código de sistema no portátil con, por ejemplo, IP_PKTINFO o SO_BINDTODEVICE en Linux. El código de ejemplo se puede encontrar en la lista de correo de boost asio aquí
b) utilice dos zócalos distintos, uno para la multidifusión y otro para la unidifusión. Por lo tanto, debe especificar una dirección de escucha que no sea "0.0.0.0" en cada socket.
udp::endpoint(address_v4::from_string("239.192.152.143"), 6771)
Esta pregunta sobre SO también podría ser útil: usar una interfaz de red específica para un socket en windows