gpt4 book ai didi

c++ - Boost.Asio IPv6 为什么绑定(bind)错误?

转载 作者:太空狗 更新时间:2023-10-29 23:02:53 26 4
gpt4 key购买 nike

我想在 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 绑定(bind)代码是...

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环回地址绑定(bind)正常,但具体("fe80::215:17ff:fe62:d168")地址绑定(bind)错误。

异常错误是“绑定(bind):无效参数”。

为什么绑定(bind)错误?

最佳答案

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

也许(部分)

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

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

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


你的代码没问题,我已经测试过它可以在 Linux 和 MSVC 上运行(替换我的 NIC 地址)

关于c++ - Boost.Asio IPv6 为什么绑定(bind)错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27170470/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com