2009-02-28 5 views
5

Wie erhält man einen Socket zum Empfangen von Paketen, die für die IPv6-Subnetz-Router-Anycast-Adresse bestimmt sind?Python: Einen IPv6-Socket zum Empfangen von Paketen erhalten, die für die Subnet-Router-Anycast-Adresse bestimmt sind

Ich habe keine Informationen finden, wie dies zu tun ist.

In einem Anfall von Verzweiflung, ich habe versucht, mit socket.setsockopt, wie Sie eine Multicast-Gruppe beitreten würde:

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

Und auch binden mit

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

Wie erwartet, weder von diese funktionierten. Gibt es eine Möglichkeit, dies zu tun?

Antwort

2

Anstelle von IPV6_JOIN_GROUP versuchen Sie, IPV6_JOIN_ANYCAST an Ihren Code s.setsockopt() zu übergeben. Leider definiert das Python socket Modul es nicht, aber Sie sollten stattdessen die Integer-Entsprechung übergeben können. In Linux IPV6_JOIN_ANYCAST ist 27 und IPV6_LEAVE_ANYCAST ist 28. (Definiert in /usr/include/linux/in6.h)

Die beste Dokumentation die ich finden konnte aus ist diese lkml e-mail describing the anycast patch to the Linux kernel:

Die Anwendungsschnittstelle für den Beitritt und Verlassen Anycast-Gruppen 2 neue setsockopt() Anrufe: IPV6_JOIN_ANYCAST und IPV6_LEAVE_ANYCAST. Die Argumente sind die gleichen wie die entsprechenden Multicast-Operationen.

Möge das Tanzen Kame mit dir sein!

0

Die Socketoptionen IPV6_JOIN_ANYCAST und IPV6_LEAVE_ANYCAST sind nicht standardmäßige Linux-Ismen.

Wenn Sie möchten, dass Ihr Code Portable ist, dann sollten Sie wahrscheinlich die Standardmethode verwenden, dh die Anycastadresse des Subnetzrouters der entsprechenden Schnittstelle zuweisen, dann Ihren Socket an die Platzhalteradresse binden und alles verwerfen nicht an die Subnetz-Router-Anycast-Adresse gesendet. Denken Sie daran, dass Sie keine Pakete mit der Anycast-Adresse im Quellfeld senden dürfen und dass Sie in der Standard-Socket-API keinen schreibgeschützten Socket öffnen können.

Zuweisen einer Schnittstellenadresse sollte eine privilegierte Operation auf jedem vernünftigen Betriebssystem sein, und das ist der Teil, der nicht Standard sein wird, was auch immer Sie tun. Wenn Sie das programmatisch tun müssen, dann wird es (auf BSD zum Beispiel) etwas wie den SIOCAIFADDR_IN6 Code und den ioctl() Systemaufruf bedeuten. Stellen Sie sicher, dass das Flag IN6_IFF_ANYCAST im Feld ifra_flags der Schnittstellenalias-Anforderungsstruktur festgelegt ist.

Verwandte Themen