【发布时间】:2015-09-27 01:45:06
【问题描述】:
我打算使用tcp::acceptor 在单个本地端口上同时接受 IPv4 和 IPv6 连接,例如 55555。我的代码最终是这样的:
tcp::acceptor acceptor_ipv4(io_svc, tcp::endpoint(tcp::v4(), 55555));
tcp::acceptor acceptor_ipv6(io_svc, tcp::endpoint(tcp::v6(), 55555));
acceptor_ipv4.async_accept(socket_ipv4, ...);
acceptor_ipv6.async_accept(socket_ipv6, ...);
我是网络编程和 Boost.Asio 的新手,我想确定这是否是正确的代码,或者是否存在任何可移植性问题。
【问题讨论】:
-
它是否有效?
-
@JohnZwinck 似乎适用于我的 Win 7 64 位。
-
好吧,在 Linux 机器上测试它,如果它有效,你就会得到答案。
-
需要注意的一点是,在某些操作系统上,有一个标志来决定侦听 IPv6 的套接字是只接收 IPv6 连接还是同时接收 IPv4 和 IPv6 连接。如果套接字设置为同时接收 IPv4 和 IPv6,则第二个绑定调用将失败,因为该端口号已在 IPv4 上使用。而且您的代码中似乎没有错误检查,这意味着如果发生该错误,那么刚刚发生的事情可能并不明显。
-
@kasperd 接受器的构造函数将抛出错误,并显示与失败绑定相对应的消息。
标签: c++ network-programming boost-asio ipv6