2009-02-28 1 views
5

IPv6 서브넷 - 라우터 애니 캐스트 주소로 지정된 패킷을 수신하기 위해 소켓을 얻으려면 어떻게해야합니까?파이썬 : 서브넷 라우터로 지정된 패킷을 수신하기위한 IPv6 소켓 얻기 애니 캐스트 주소

이 작업을 수행하는 방법에 대한 정보를 찾을 수 없었습니다. 로 desparation의 적합에

, 당신은 멀티 캐스트 그룹에 가입 할 socket.setsockopt 사용하여 시도했다 :

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

을 예상대로 또한 둘의 결합

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

를 사용하여 이것들은 효과가 있었다. 이것을 할 수있는 방법이 있습니까?

답변

2

IPV6_JOIN_GROUP 대신 IPV6_JOIN_ANYCASTs.setsockopt() 코드로 전달하십시오. 불행하게도 파이썬 socket 모듈은이 모듈을 정의하지 않지만 대신 정수를 전달할 수 있어야합니다. 리눅스에서 IPV6_JOIN_ANYCAST27이고 IPV6_LEAVE_ANYCAST28입니다.

내가 찾을 수있는 가장 좋은 문서에서입니다 (/usr/include/linux/in6.h에 정의)이 lkml e-mail describing the anycast patch to the Linux kernel :

애니 캐스트 그룹에 가입하고 떠나 응용 프로그램 인터페이스는 2 새로운 setsockopt를하다() 호출 : IPV6_JOIN_ANYCAST 및 IPV6_LEAVE_ANYCAST. 인수 은 해당 멀티 캐스트 작업과 같습니다.

춤추는 kame이 너와 있을지도 몰라!

0

IPV6_JOIN_ANYCASTIPV6_LEAVE_ANYCAST 소켓 옵션은 비표준 Linux-isms입니다.

코드를 휴대용으로 만들려면 표준 방식으로해야합니다. 즉, 서브넷 라우터 애니 캐스트 주소를 적절한 인터페이스에 할당 한 다음 소켓을 와일드 카드 주소에 바인딩하고 모든 것을 버려야합니다 서브넷 라우터 애니 캐스트 주소로 전송되지 않습니다. 소스 필드에서 애니 캐스트 주소로 패킷을 보내지 않아야하며 표준 소켓 API에서 읽기 전용 소켓을 열 수 없습니다.

인터페이스 주소 할당은 합리적인 운영 체제에서 권한있는 작업이어야하며 이는 사용자가하는 일은 표준이 될 수 없습니다. 이를 프로그래밍 방식으로 수행해야한다면 SIOCAIFADDR_IN6 코드와 ioctl() 시스템 호출과 같은 것을 사용하여 (예 : BSD에서) 의미합니다. 인터페이스 별칭 요청 구조의 ifra_flags 필드에 IN6_IFF_ANYCAST 플래그를 설정해야합니다.