Python 3 - 无法接收IPv6数据包(UDP - linux)

时间:2014-12-18 18:11:09

标签: linux sockets python-3.x udp ipv6

我有一个尝试接收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. 如果我绑定到地址" :: 1",我可以绑定到该地址。但是,我从未收到任何IPv6数据包。
  2. 我尝试使用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])

  3. socket.getaddrinfo返回[(10,2,17,'',(' fe80 :: fab1:56ff:fe9a:cfef',46780,0,0)) ]

    1. 如果我尝试直接绑定到我的IPv6地址,我还收到了#34;无效的参数"。但是,当我将范围从0更改为5时,我收到错误"无法分配请求地址"。 rtp_socket.bind( (host_ipv6_addr, port_num, 0, 5))
    2. 非常感谢任何见解。我在这一点上猜测我没有正确设置以太网卡或其他东西。

      更新: 使用Michael Hampton的答案,我通过使用来自socket.getaddrinfo的信息解决了我的问题,IP地址为" fe80 :: fab1:56ff:fe9a:cfef%eth1"并将结果粘贴到rtp_socket.bind()中。范围ID从0到3。

1 个答案:

答案 0 :(得分:2)

您尝试绑定到链接本地地址,但忘记包含the scope ID(在这种情况下,%eth1)。

所以你应该绑定到地址fe80::fab1:56ff:fe9a:cfef%eth1