Boost.Asio IPv6 为什么绑定错误

Boost.Asio IPv6 Why bind error?

本文关键字:绑定 错误 为什么 IPv6 Asio Boost      更新时间:2023-10-16

我想在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")地址是绑定错误。

异常错误为"绑定:无效参数"。

为什么绑定错误?

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

也许(部分)

  • IPv6 已被禁用(即使适配器显然有能力且已配置)
  • /proc 未挂载(您是否处于受限环境中,例如chroot监狱?
  • IP地址实际上是不同的 - 这有点蹩脚,因为你会检查无数次,但我觉得我至少应该提到它

现在,尝试在限制较少的环境中(例如,外部虚拟化容器,作为root...

如果这不能获得所需的信息,请考虑使用straceltrace来查看哪些系统调用失败。


您的代码还可以,我已经测试了它在 Linux 和 MSVC 上运行(替换我的 NIC 地址)