2009-02-28 25 views
5

Làm thế nào để bạn nhận được một ổ cắm để nhận các gói dữ liệu dành cho địa chỉ IPv6 Subnet-Routers Anycast?Python: Nhận một ổ cắm IPv6 để nhận các gói được định sẵn cho địa chỉ Subnet-Routers Anycast

Tôi chưa thể tìm thấy bất kỳ thông tin nào về cách thực hiện việc này.

Trong một cơn desparation, tôi đã cố gắng sử dụng socket.setsockopt như bạn sẽ tham gia vào một nhóm 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) 

Và cũng sử dụng ràng buộc

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

Đúng như dự đoán, không ai trong số những công việc này. Có cách nào để làm việc này không?

Trả lời

2

Thay vì IPV6_JOIN_GROUP, hãy thử chuyển IPV6_JOIN_ANYCAST tới mã s.setsockopt() của bạn. Thật không may mô-đun Python socket không xác định nó nhưng bạn sẽ có thể vượt qua tương đương số nguyên thay thế. Trong Linux IPV6_JOIN_ANYCAST27IPV6_LEAVE_ANYCAST28. (Quy định tại /usr/include/linux/in6.h)

Các tài liệu tốt nhất mà tôi có thể tìm thấy từ này lkml e-mail describing the anycast patch to the Linux kernel:

Giao diện ứng dụng để gia nhập và rời khỏi nhóm anycast là 2 setsockopt mới() cuộc gọi: IPV6_JOIN_ANYCAST và IPV6_LEAVE_ANYCAST. Đối số giống với các hoạt động phát đa hướng tương ứng.

Có thể tham gia trò chơi nhảy với bạn!

0

Các tùy chọn ổ cắm IPV6_JOIN_ANYCASTIPV6_LEAVE_ANYCAST không phải là tiêu chuẩn Linux-isms.

Nếu bạn muốn mã của mình là di động, thì có lẽ bạn nên làm theo cách chuẩn, nghĩa là chỉ định địa chỉ anycast của mạng con cho giao diện thích hợp, sau đó kết nối ổ cắm của bạn với địa chỉ ký tự đại diện và hủy mọi thứ không được gửi đến địa chỉ anycast router subnet. Hãy nhớ rằng, bạn không được phép gửi các gói với địa chỉ anycast trong trường nguồn và bạn không thể mở một ổ cắm chỉ đọc trong API ổ cắm tiêu chuẩn.

Chỉ định địa chỉ giao diện phải là một hoạt động đặc quyền trên bất kỳ hệ điều hành hợp lý nào và đó là một phần không đạt tiêu chuẩn cho dù bạn làm gì. Nếu bạn phải làm điều đó theo chương trình, sau đó nó sẽ có nghĩa là (trên BSD ví dụ) sử dụng một cái gì đó giống như mã số SIOCAIFADDR_IN6 và các cuộc gọi hệ thống ioctl(). Đảm bảo đặt cờ IN6_IFF_ANYCAST trong trường ifra_flags của cấu trúc yêu cầu bí danh giao diện.

Các vấn đề liên quan