我有一个尝试接收IPv6数据包的脚本,但它无法接收任何数据包。
首先,这是我在ifconfig上的以太网配置。
eth1 Link encap:Ethernet HWaddr f8:b1:56:9a:cf:ef
inet addr:192.168.1.90 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::fab1:56ff:fe9a:cfef/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:751359199 errors:38 dropped:10874 overruns:0 frame:35
TX packets:23407 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1033523557150 (1.0 TB) TX bytes:2002869 (2.0 MB)
Interrupt:20 Memory:ef400000-ef420000
我有两张网卡,但我正在使用一张网络,一张用于测试。第二张卡连接到发送以太网数据包的设备。我正在配置该设备以发送IPv6数据包到地址fe80 :: fab1:56ff:fe9a:cfef和端口46780(但是,我可以将其配置为发送到任何IPv6地址和任何端口)。我写了一个python脚本来接收这些数据包,但我得到一个错误,或者我的脚本没有找到数据包。我通过wireshark和使用原始python套接字确认了这些数据包。
以下列出了我尝试过的事情以及遇到的各种错误/问题。
我尝试使用socket.getaddrinfo(),然后使用返回的信息并绑定到那个,但是当我尝试这样做时,我收到错误"无效的参数"
info = socket.getaddrinfo(host_ipv6_addr, port_num, socket.AF_INET6,
socket.SOCK_DGRAM, 0, socket.AI_PASSIVE)
rtp_socket.bind(info[0][4])
socket.getaddrinfo返回[(10,2,17,'',(' fe80 :: fab1:56ff:fe9a:cfef',46780,0,0)) ]
rtp_socket.bind( (host_ipv6_addr, port_num, 0, 5))
非常感谢任何见解。我在这一点上猜测我没有正确设置以太网卡或其他东西。
更新: 使用Michael Hampton的答案,我通过使用来自socket.getaddrinfo的信息解决了我的问题,IP地址为" fe80 :: fab1:56ff:fe9a:cfef%eth1"并将结果粘贴到rtp_socket.bind()中。范围ID从0到3。
答案 0 :(得分:2)
您尝试绑定到链接本地地址,但忘记包含the scope ID(在这种情况下,%eth1
)。
所以你应该绑定到地址fe80::fab1:56ff:fe9a:cfef%eth1
。