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

C++ Boost.Asio IPv6为什么绑定错误?,c++,boost,boost-asio,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 scop

我想在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
ifconfig-a
em1:标志=4163 mtu 1500
inet 172.16.16.109网络掩码255.255.255.0广播172.16.16.255
inet6 fe80::215:17ff:fe62:d168预桥64作用域ID 0x20
以太网络00:15:17:62:d1:68 txqueuelen 1000(以太网)
接收数据包59516986字节7105720351(6.6 GiB)
接收错误0下降5015310超出0帧0
发送数据包8680244字节1666346667(1.5 GiB)
发送错误0丢弃0溢出0载波0冲突0
设备中断18存储器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;
}
intmain(intargc,char*argv[])
{
尝试
{
boost::asio::io_服务io_服务;
const char*ip_address_string=“fe80::215:17ff:fe62:d168”;
//const char*ip_address_string=“::1”//没问题
boost::asio::ip::address my_address=boost::asio::ip::address::from_string(ip_address_string);
udp::endpoint local_endpoint(我的_地址,15060);
udp my_协议=udp::v6();
udp::套接字sock(io_服务);
sock.open(my_协议);
sock.bind(本地_端点);

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

也许(部分)

  • ipv6已被禁用(即使适配器显然能够并已配置)
  • /proc未装入(您是否处于受限环境中,如
    chroot
    jail?)
  • ip地址实际上是不同的-这是一个有点跛脚的一个,因为你已经检查了无数次,但我觉得我至少应该提到它
现在,请在限制较少的环境中进行尝试(例如,在虚拟化容器外部,如root…)

如果没有得到您需要的信息,请考虑使用<代码> Struts < /C> >或<代码> Lrace查看哪个SysCursCurror。



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

非常感谢您的评论。我将再次检查Linux机器中的ipv6模块。