【问题标题】:boost async sockets and boost::thread提升异步套接字和 boost::thread
【发布时间】:2012-10-15 04:37:09
【问题描述】:

我正在编写 TCP 客户端,它应该能够同时发送和接收数据。 你能告诉我应该如何调用async_sendasync_receive 是单独的线程吗?

也就是说如何调用

m_Socket.async_send(boost::asio::buffer(txBuf.c_str(), txBuf.length()+1),
    boost::bind(&TCPClient::sendingHandler, this, boost::asio::placeholders::error));

m_Socket.async_receive(boost::asio::buffer(rxBuf, maxBufLen),
    boost::bind(&TCPClient::sendingHandler, this, boost::asio::placeholders::error));

boost::thread receivingThread(boost::bind(...));
boost::thread sendingThread(boost::bind(...));

如果我在处理程序中再次调用async_sendasync_receive,它会正常工作吗?我需要一个不定式循环来发送/接收数据。

【问题讨论】:

  • 您不需要单独的线程来同时发送/接收。只需在同一个线程中调用async_sendasync_receiveio_service 就会为您服务。

标签: c++ boost-asio boost-thread


【解决方案1】:

主要思想是-在TCPClient::sendingHandler/receivingHandler 2io_service's 上递归发送和接收。这个 io_service's 在 2 个线程内被调用 -

boost::thread receivingThread(boost::bind(...));
boost::thread sendingThread(boost::bind(...));

这个想法在tutorial 中很明显。您必须调用和使用 2 个单独的 io_service's 的唯一区别。

另一个选项是 1 io_service 和多个调用 io_service::run 的线程。但是你必须使用boost::asio::strand远线程安全:

boost::asio::strand* _strand = new boost::asio::strand(io);
//then use it in handlers
boost::asio::async_read(*socket, 
                    boost::asio::buffer(msg.data(), result.size),
                    (*_strand).wrap(
                    boost::bind(&ConnectionInterface::parsePacket, shared_from_this(), boost::asio::placeholders::error)));

【讨论】:

  • 我需要创建 2 个io_service。在easch io_service 中,我需要使用递归调用async_recieve(boost::bind(recievingHandler)) / async_send(boost::bind(sendingHandler))。我说的对吗?
  • 是的,看看我链接的教程
  • 是的,教程很清楚。但是使用 2 io_service 并不清楚。使用 2 io_service 意味着创建 2 个套接字,不是吗?但我想找到异步套接字的解决方案。我认为使用 2 个没有 io 冲突的异步套接字是不合理的。可以给我解释一下吗?
猜你喜欢
  • 2011-12-05
  • 1970-01-01
  • 1970-01-01
  • 2016-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多