2015-07-12 5 views
1

У меня проблема с получением пакета UDPv6 с использованием Python. Пакет поставляется с интерфейсом SLIP с использованием 6LBR и целых запусков на Beagleboard, но это не так. Tcpdump захватывает пакет без каких-либо проблем:Получение многоадресной рассылки UDPv6 в Python

10:17:32.220009 IP6 (hlim 64, next-header UDP (17) payload length: 21) 
fe80::200:0:0:3.3000 > ff02::1.3000: [udp sum ok] UDP, length 13 
0x0000: 6000 0000 0015 1140 fe80 0000 0000 0000 `[email protected] 
0x0010: 0200 0000 0000 0003 ff02 0000 0000 0000 ................ 
0x0020: 0000 0000 0000 0001 0bb8 0bb8 0015 f9fe ................ 
0x0030: 4d65 7373 6167 6520 3537 3236 00   Message.5726. 

Однако, я не могу получить пакет с помощью Python:

MYPORT = 3000 
MYGROUP_6 = 'ff02::1%eth0' 

import time 
import struct 
import socket 
import sys 

def main(): 

    addrinfo = socket.getaddrinfo(MYGROUP_6, None)[0] 
    print(addrinfo) 
    s = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM) 
    s.bind(('', MYPORT)) 
    while True: 
     data, sender = s.recvfrom(150) 
     print (str(sender) + ' ' + repr(data)) 

if __name__ == '__main__': 
    main() 

С другой стороны, когда я произвожу локальный многоадресного тот же код может принимать пакет. Tcpdump выход пакета, который может быть получен:

10:29:37.301406 IP6 (hlim 3, next-header UDP (17) payload length: 30) 
fe80::c03a:f9ff:fe3d:9b30.56963 > ff02::1.3000: [udp sum ok] UDP, length 22 
    0x0000: 6000 0000 001e 1103 fe80 0000 0000 0000 `............... 
    0x0010: c03a f9ff fe3d 9b30 ff02 0000 0000 0000 .:...=.0........ 
    0x0020: 0000 0000 0000 0001 de83 0bb8 001e 20ca ................ 
    0x0030: 3134 3336 3639 3639 3737 2e33 3030 3532 1436696977.30052 
    0x0040: 3164 7570 6100       1dupa. 

Почему? Как я могу захватить этот первый пакет с помощью python?

ARM Linux Конфигурация IP: Конфигурация IP

[email protected]:~$ sudo ifconfig 
eth0  Link encap:Ethernet HWaddr c2:3a:f9:3d:9b:30 
      inet addr:192.168.1.206 Bcast:192.168.1.255 Mask:255.255.255.0 
      inet6 addr: fe80::c03a:f9ff:fe3d:9b30/64 Scope:Link 
      UP BROADCAST RUNNING MULTICAST DYNAMIC MTU:1500 Metric:1 
      RX packets:261457 errors:0 dropped:0 overruns:0 frame:0 
      TX packets:568962 errors:0 dropped:0 overruns:0 carrier:0 
      collisions:0 txqueuelen:1000 
      RX bytes:28323386 (27.0 MiB) TX bytes:71483396 (68.1 MiB) 

Contiki узла:

MAC 00:00:00:00:00:00:00:03 Contiki-2.7-7-g9698ca5 started. 
Node id is set to 3. 
nullmac nullrdc, channel check rate 128 Hz, radio channel 26 
Tentative link-local IPv6 address fe80:0000:0000:0000:0200:0000:0000:0003 
Starting 'Unicast sender example process' 
IPv6 addresses: bbbb::200:0:0:3 
Sending unicast to ff02::1 

ответ

0

Вы забыли присоединиться к группе многоадресной рассылки. Ваш процесс связывается с подстановочным адресом на порту 3000. Любой пакет, который поступает с этим номером порта назначения, доставляется в ваш процесс, но вы на самом деле не просите операционную систему подписывать процесс на группу многоадресной рассылки, чтобы не было причина для получения пакета (если он не создан локально).

Чтобы подписаться систему многоадресного платье вы делаете:

# Get the interface index for eth0 
interface_index = socket.if_nametoindex("eth0") 

# Create the JOIN option data 
mc_addr = ipaddress.IPv6Address('ff02::1') 
join_data = struct.pack('16sI', mc_addr.packed, interface_index) 

# And join the group 
sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, join_data) 
+0

Спасибо за ответ. Я добавил код, ответственный за присоединение к группе. Однако он ведет себя одинаково, получаются локаторы, генерируемые локально, а те из fe80 :: 200: 0: 0: 3.3000 - нет. Может быть, порт источника - проблема? – akandr

+0

Думая об этом: все узлы уже соединены с группой 'ff02 :: 1', поэтому забыть подписаться на нее не приведет к сбою. Однако подписка по-прежнему правильная. –

+0

Я протестировал код здесь, и, похоже, он отлично работает на ПК. У меня нет вашего конкретного оборудования, поэтому я не могу воспроизвести это, извините :( –

Смежные вопросы