2009-02-28 9 views
5

¿Cómo se obtiene una toma para recibir paquetes destinados a la dirección IPv6 Subred-Routers Anycast?Python: Conseguir una toma de IPv6 para recibir los paquetes destinados a la dirección de subred Anycast-Routers

No he podido encontrar ninguna Informationn sobre cómo hacer esto.

En un ataque de desparation, He intentado usar socket.setsockopt como lo haría para unirse a un grupo de multidifusión:

# 7 is the interface number 
s = socket(AF_INET6, SOCK_DGRAM) 
packed_iface_num = struct.pack("I", 7) 
group = inet_pton(AF_INET6, 'fd36:d00d:d00d:47cb::') + packed_iface_num 

# socket.error: (22, 'Invalid argument') 
s.setsockopt(IPPROTO_IPV6, IPV6_JOIN_GROUP, group) 

Y también usando bind

# socket.error: (99, 'Cannot assign requested address') 
s.bind(('fd36:773e:6b4c:47cb::', 9876)) 

Como era de esperar, ninguno de los dos estos funcionaron ¿Hay alguna forma de hacer esto?

Respuesta

2

En lugar de IPV6_JOIN_GROUP, intente pasar IPV6_JOIN_ANYCAST a su código s.setsockopt(). Lamentablemente, el módulo Python socket no lo define, pero en su lugar debería poder pasar el equivalente entero. En Linux IPV6_JOIN_ANYCAST es 27 y IPV6_LEAVE_ANYCAST es 28. (Definido en /usr/include/linux/in6.h)

La mejor documentación que pude encontrar a partir de este lkml e-mail describing the anycast patch to the Linux kernel:

La interfaz de la aplicación para la unión y dejando grupos de difusión ilimitada es 2 nueva setsockopt() llamadas: IPV6_JOIN_ANYCAST y IPV6_LEAVE_ANYCAST. Los argumentos son los mismos que las operaciones de multidifusión correspondientes.

Que el kame baile estar contigo!

0

Las opciones de socket IPV6_JOIN_ANYCAST y IPV6_LEAVE_ANYCAST son Linux-ismos no estándar.

Si desea que su código sea portátil, a continuación, probablemente debería hacerlo de la manera estándar, es decir, asignar la dirección anycast subred routers a la interfaz apropiada, a continuación, enlazar su socket a la dirección de comodín y desechar todo lo no enviado a la dirección anycast del enrutador de subred. Recuerde, se supone que no debe enviar paquetes con la dirección anycast en el campo fuente, y no puede abrir un socket de solo lectura en la API de sockets estándar.

Asignación de una dirección de interfaz debe ser una operación privilegiada en cualquier sistema operativo razonable, y esa es la parte que no va a ser la norma lo que hagas. Si debe hacer eso programáticamente, significará (en BSD, por ejemplo) usar algo como el código SIOCAIFADDR_IN6 y la llamada al sistema ioctl(). Asegúrese de establecer el indicador IN6_IFF_ANYCAST en el campo ifra_flags de la estructura de solicitud de alias de interfaz.

Cuestiones relacionadas