两个接收器在同一个插座上

时间:2014-06-29 14:35:24

标签: c++ boost-asio

一个套接字上可以有两个接受器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()的地方并不重要(或者它是什么?)。

感谢您的帮助&建议。

2 个答案:

答案 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同步,则可能会调用未定义的行为,因为socketnot thread safe