Considere una aplicación de multidifusión IPv6 simple:

  • Un programa "hablante" envía periódicamente paquetes IPv6 UDP a un grupo de multidifusión conocido y los envía a un puerto conocido.
  • Cero o más programas de "escucha" se unen a ese puerto conocido y se unen al grupo de multidifusión conocido, y todos reciben los paquetes UDP.

Todo eso funciona bastante bien, excepto en el caso de que uno o más de los programas de escucha no puedan vincularse al puerto UDP conocido porque un socket en algún otro programa (no relacionado) ya se ha vinculado a ese puerto UDP (y no No configure las opciones SO_REUSEADDR y / o SO_REUSEPORT para permitir que se comparta con cualquier otra persona). AFAICT en ese caso, el programa de escucha simplemente no tiene suerte, no hay nada que pueda hacer para recibir los datos de multidifusión, salvo pedirle al usuario que termine el programa interferente para liberar el puerto.

¿O hay? Por ejemplo, ¿existe alguna técnica o enfoque que permita a un oyente de multidifusión recibir todos los paquetes de multidifusión entrantes para un grupo de multidifusión determinado, independientemente del puerto UDP al que se envíen?

-1
Jeremy Friesner 22 ene. 2021 a las 03:59

1 respuesta

La mejor respuesta

Si desea recibir todo el tráfico de multidifusión independientemente del puerto, deberá utilizar sockets sin procesar para obtener el datagrama IP completo. Luego, puede inspeccionar directamente el encabezado IP, verificar si está usando UDP y luego verificar el encabezado UDP antes de leer los datos de la capa de aplicación. Tenga en cuenta que los métodos para hacer esto son específicos del sistema operativo y generalmente requieren privilegios administrativos.

Con respecto a SO_REUSEADDR y SO_REUSEPORT, las aplicaciones que hacen esto permitirán que varios programas reciban paquetes de multidifusión enviados a un puerto determinado. Sin embargo, si también necesita recibir paquetes de unidifusión, este método tiene problemas. Los paquetes de unidifusión entrantes pueden configurarse en ambos sockets, siempre pueden enviarse a un socket específico o enviarse a cada uno de forma alterna. Esto también difiere según el sistema operativo.

1
dbush 22 ene. 2021 a las 17:27