一个套接字上可以有两个接受器async_accept吗?我想听ipv4和amp;的IPv6。
换句话说,以下用法是否有效?
using boost::asio::ip::tcp;
boost::asio::io_service io_service;
tcp::acceptor a4(io_service, tcp::endpoint(tcp::v4(), port_));
tcp::acceptor a6(io_service, tcp::endpoint(tcp::v6(), port_));
tcp::socket s(io_service);
a4.async_accept(s, std::bind(handle_connection, s, std::placeholders::_1);
a6.async_accept(s, std::bind(handle_connection, s, std::placeholders::_1);
让我们忽略它周围的代码,我以后用套接字做什么以及我调用io_service.run()的地方并不重要(或者它是什么?)。
感谢您的帮助&建议。
答案 0 :(得分:2)
据我所知,调用io_service.run()是强制性的,否则不会发生那么多...... Look up the examples Here
为每个连接设置套接字(Here),否则您将覆盖由async_accept()
此函数用于异步接受新连接 插座...
注意短语"进入插座"
答案 1 :(得分:2)
每次接受操作最好使用socket
。当两个异步接受操作尝试使用同一个对等方socket
:
io_service
(即隐式strand)或在显式链中调用操作,则结果未指定为未指定操作完成的顺序。 socket
将与首先完成的操作的连接相关联。当其他操作完成时,如果boost::asio::error::already_open
仍与另一个连接相关联,则会以socket
失败。io_service
且操作未与strand同步,则可能会调用未定义的行为,因为socket
为not thread safe。