【问题标题】:Python 3 - Cannot receive IPv6 packets (UDP - linux)Python 3 - 无法接收 IPv6 数据包(UDP - linux)
【发布时间】: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. 如果我绑定到地址“::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])

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

  1. 如果我尝试直接绑定到我的 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


    【解决方案1】:

    您正在尝试绑定到链接本地地址,但您忘记包含 the scope ID(在本例中为 %eth1)。

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

    【讨论】:

      猜你喜欢
      • 2012-01-26
      • 2014-12-13
      • 2013-11-08
      • 1970-01-01
      • 2018-08-19
      • 2011-03-02
      • 2015-11-26
      • 1970-01-01
      • 2022-11-02
      相关资源
      最近更新 更多