2009-02-28 8 views
5

W jaki sposób otrzymasz gniazdo do odbierania pakietów przeznaczonych dla adresu IP routera podsieci IPv6?Python: Uzyskiwanie gniazda IPv6 do odbierania pakietów przeznaczonych dla routerów podsieci Adres anycastowy

Nie mogłem znaleźć żadnych informacji na temat tego, jak to zrobić.

W przypływie desparation, próbowałem za pomocą socket.setsockopt jak by przyłączyć się do grupy multicast:

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

A także za pomocą wiązania

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

Zgodnie z oczekiwaniami, ani te zadziałały. Czy jest jakiś sposób na zrobienie tego?

Odpowiedz

2

Zamiast IPV6_JOIN_GROUP, spróbuj przekazać IPV6_JOIN_ANYCAST do swojego kodu s.setsockopt(). Niestety moduł Python socket nie definiuje go, ale powinieneś być w stanie przekazać ekwiwalent liczby całkowitej zamiast tego. W systemie Linux IPV6_JOIN_ANYCAST jest 27 i IPV6_LEAVE_ANYCAST jest 28. (Zdefiniowane w /usr/include/linux/in6.h)

Najlepszym dokumentacja udało mi się znaleźć to z tego lkml e-mail describing the anycast patch to the Linux kernel:

Interfejs aplikacji do łączenia i grupy opuszczające Anycast jest 2 nowy setsockopt() połączenia: IPV6_JOIN_ANYCAST i IPV6_LEAVE_ANYCAST. Argumenty są takie same jak odpowiadające im operacje rozsyłania grupowego.

Niech tańczący kame będzie z tobą!

0

Opcje gniazd IPV6_JOIN_ANYCAST i IPV6_LEAVE_ANYCAST są niestandardowymi systemami Linux-isms.

Jeśli chcesz, aby Twój kod był przenośny, powinieneś zrobić to w standardowy sposób, tj. Przypisać adres anycast routera podsieci do odpowiedniego interfejsu, a następnie związać gniazdo z adresem wieloznacznym i odrzucić wszystko nie wysłane do adresu anycast routera podsieci. Pamiętaj, że nie powinieneś wysyłać pakietów z adresem anycast w polu źródłowym i nie możesz otworzyć gniazda tylko do odczytu w standardowym interfejsie API gniazd.

Przypisanie adresu interfejsu powinno być uprzywilejowaną operacją w każdym rozsądnym systemie operacyjnym, a to jest część, która nie będzie standardem, niezależnie od tego, co robisz. Jeśli musisz to zrobić programowo, to będzie to oznaczać (na przykład na BSD) używając czegoś takiego jak kod SIOCAIFADDR_IN6 i wywołanie systemowe ioctl(). Upewnij się, że ustawiono flagę IN6_IFF_ANYCAST w polu ifra_flags struktury żądania aliasu interfejsu.

Powiązane problemy