【发布时间】:2015-02-17 14:54:16
【问题描述】:
我有一个脚本正在尝试接收 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套接字。
这是我尝试过的事情以及遇到的各种错误/问题的列表。
- 如果我绑定到地址“::1”,我可以绑定到该地址。但是,我从未收到任何 IPv6 数据包。
-
我尝试使用 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))]
- 如果我尝试直接绑定到我的 IPv6 地址,我还会收到“无效参数”。但是,当我将范围从 0 更改为 5 时,我收到了错误“无法分配请求地址”。
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。
【问题讨论】:
标签: linux sockets python-3.x udp ipv6