Boost.Asio IPv6为什么绑定错误?

时间:2014-11-27 12:09:52

标签: c++ boost boost-asio

我想在Linux(fedora)中使用boost asio来使用IPv6。

网卡

ifconfig -a
em1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.16.16.109  netmask 255.255.255.0  broadcast 172.16.16.255
        inet6 fe80::215:17ff:fe62:d168  prefixlen 64  scopeid 0x20<link>
        ether 00:15:17:62:d1:68  txqueuelen 1000  (Ethernet)
        RX packets 59516986  bytes 7105720351 (6.6 GiB)
        RX errors 0  dropped 5015310  overruns 0  frame 0
        TX packets 8680244  bytes 1666346667 (1.5 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 18  memory 0xb8820000-b8840000

和IPv6 udp绑定代码是......

int main(int argc, char* argv[])
{
    try
    {
        boost::asio::io_service io_service;

        const char* ip_address_string = "fe80::215:17ff:fe62:d168";
        // const char* ip_address_string = "::1";  // It's OK
        boost::asio::ip::address my_address = boost::asio::ip::address::from_string(ip_address_string);
        udp::endpoint local_endpoint(my_address, 15060);

        udp my_protocol = udp::v6();
        udp::socket sock(io_service);
        sock.open(my_protocol);
        sock.bind(local_endpoint);

        std::cout << "ip:" << local_endpoint.address().to_string() << std::endl;
        // -*/

    }
    catch (std::exception& e)
    {
        std::cerr << e.what() << std::endl;
    }

    return 0;
}

v6环回地址的绑定没问题,但具体(“fe80 :: 215:17ff:fe62:d168”)地址是绑定错误。

异常错误是“bind:无效的参数”。

为什么绑定错误?

1 个答案:

答案 0 :(得分:1)

您可能没有权限访问外部网络适配器。

也许(部分)

  • ipv6已被禁用(即使适配器显然能够配置)
  • / proc未挂载(您是否在受限制的环境中,如chroot jail?);
  • ip地址实际上是不同的 - 这有点蹩脚,因为你已经检查了这么多次,但我觉得我至少应该提到它

现在,尝试在限制较少的环境中(例如,外部虚拟化容器,以root身份......)。

如果这不能为您提供所需信息,请考虑使用straceltrace查看哪些系统调用失败。


您的代码没问题,我已经测试过它可以在Linux和MSVC上工作(替换我的网卡地址)