我想在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:无效的参数”。
为什么绑定错误?
答案 0 :(得分:1)
您可能没有权限访问外部网络适配器。
也许(部分)
chroot
jail?); 现在,尝试在限制较少的环境中(例如,外部虚拟化容器,以root身份......)。
如果这不能为您提供所需信息,请考虑使用strace
或ltrace
查看哪些系统调用失败。
您的代码没问题,我已经测试过它可以在Linux和MSVC上工作(替换我的网卡地址)