【问题标题】:IPV6 Binding Failure Error: Cannot assign requested addressIPV6 绑定失败错误:无法分配请求的地址
【发布时间】:2017-04-13 16:31:52
【问题描述】:
  1. 我已经为 Ubuntu Linux 系统配置了以下接口和分配的 IPV6 地址,如下所示:

    Eth0:链路封装:以太网 HWaddr 00:50:56:8d:57:64
    inet 地址:192.168.254.10 广播:0.0.0.0 掩码:255.255.255.0
    inet6 地址:fe80::250:56ff:fe8d:5764/64 范围:链接
    UP BROADCAST RUNNING MTU:1500 Metric:1
    RX 数据包:74231424 错误:0 丢弃:1 超限:0 帧:0
    TX 数据包:400372550 错误:0 丢弃:0 超限:0 运营商:0 碰撞:0 txqueuelen:1000
    RX 字节:24514286488 (24.5 GB) TX 字节:115992171490 (115.9 GB)

    Eth1:链路封装:以太网 HWaddr 00:50:56:8d:7c:4c
    inet 地址:192.168.1.10 广播:0.0.0.0 掩码:255.255.255.0
    inet6 地址:fe80::250:56ff:fe8d:7c4c/64 范围:链接
    inet6 地址:fc00:1234:1::10/120 范围:全球
    UP BROADCAST RUNNING MTU:1500 Metric:1
    RX 数据包:434933479 错误:0 丢弃:1 超限:0 帧:0
    TX 数据包:39666183 错误:0 丢弃:0 超限:0 运营商:0 碰撞:0 txqueuelen:1000
    RX 字节:126065364448 (126.0 GB) TX 字节:14437801257 (14.4 GB)

    Eth2:链路封装:以太网 HWaddr 00:50:56:8d:56:14
    inet 地址:192.168.2.10 广播:0.0.0.0 掩码:255.255.255.0
    inet6 地址:fc00:1234:2::10/120 范围:全球
    inet6 地址:fe80::250:56ff:fe8d:5614/64 范围:链接
    UP BROADCAST RUNNING MTU:1500 Metric:1
    RX 数据包:480068741 错误:0 丢弃:0 超限:0 帧:0
    TX 数据包:34145702 错误:0 丢弃:0 超限:0 运营商:0 碰撞:0 txqueuelen:1000
    RX 字节:146795537550 (146.7 GB) TX 字节:10045338657 (10.0 GB)

  2. 我想使用 IPV6 套接字进行套接字编程。我写的sn-p代码如下:

    struct sockaddr_in6 sin
    ipv6_fdr = socket(PF_INET6, SOCK_DGRAM, IPPROTO_UDP)

    bzero(&sin, sizeof(sin));
    sin.sin6_family = AF_INET6;
    sin.sin6_port = htons(2152);
    if ((setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(int))) memcpy(&(sin.sin6_addr), "fc00:1234:1::10",sizeof(sin.sin6_addr));
    if ((bind(sock, (struct sockaddr*)&sin, sizeof(sin)))

  3. 编译成功后,出现 IPV6 绑定失败错误,错误编号和名称如下:
    EADDRNOTAVAIL 99 /* 无法分配请求的地址
    经过一定次数的 IPV6 绑定尝试后,它会引发分段错误。

如果有人能帮助我解决我在这里犯了什么错误以及为什么 IPV6 绑定失败,那就太好了?

【问题讨论】:

  • 仅供参考,地址fc00:1234:1::10 位于不允许使用的保留范围内。 ULA 寻址在fc00::/7 范围内,但fc00::/8 范围的一半保留给尚未命名的全局权限分配。范围的一半 fd00::/8 对本地分配开放,但您必须使用随机数生成器来分配地址中的下 40 位。您似乎还有一个问题,即您没有使用 /64 作为网络大小。如果您使用不同的网络大小,IPv6 中的许多事情可能会失败。除了少数例外,您应该使用/64 网络。
  • @RonMaupin 我尝试按照您的建议使用 /64 网络大小更改我的 IPV6 地址。此外,我尝试了各种前缀和不同网络配置范围的不同 inet6 地址。运行脚本时仍然存在相同的问题。 IPV6 绑定失败:无法分配请求的地址。请帮助我。
  • 我并没有试图解决您的问题。我试图指导您进行正确的 IPv6 寻址,我认为这不是您发布的问题,但如果您解决当前问题,它可能会带来一系列不同的问题。

标签: linux sockets udp bind ipv6


【解决方案1】:

您的代码中的问题在于:

memcpy(&(sin.sin6_addr), "fc00:1234:1::10",sizeof(sin.sin6_addr));

需要将人类可读的字符串转换为二进制,并将二进制形式的地址存储到 sin6_addr 中,如:

inet_pton (AF_INET6, "fc00:1234:1::10", sin.sin6_addr.s6_addr);

【讨论】:

    猜你喜欢
    • 2020-08-24
    • 2021-03-07
    • 2019-12-26
    • 2019-10-11
    • 2022-01-16
    • 2013-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多