我是socket IO的新手。我一直在使用socket::read_some()
从套接字中提取数据。我相信我比套接字上的数据更经常地询问套接字数据,所以看起来'read_some()`的阻塞性质正在减慢我的程序执行到数据来自套接字的速率。我想检查数据然后继续,如果没有任何东西。我的代码目前看起来像这样:
unsigned char incomingData[PARTIAL_PKT_BUFF_SIZE];
int numRead = 0;
numRead =
_socket.read_some(boost::asio::buffer(incomingData,PARTIAL_PKT_BUFF_SIZE));
如果我在this question的第一个答案中实现代码,看起来我将使用bytes_readable
对象来控制套接字,然后我可以检查是否{{1返回大于零然后读取套接字。
看起来像async_read()可能会完成这项工作,但我必须承认我并不是真的理解它。看起来我需要注册一个回调,这表明我可能需要在缓冲区周围放置一些安全机制。我认为这是一个更复杂的解决方案吗?
答案 0 :(得分:2)
我想查看数据,然后继续进行,如果没有任何内容
您刚刚描述了称为民意调查的方法。
看起来
async_read()
可能会完成这项工作,但我必须承认我 不太了解它。
正确,async_read()
是完美的解决方案。
看起来我需要注册一个 回调,这表明我可能需要放一些安全措施 缓冲区周围的机制。我是否正确地认为这是一个更多 复杂的解决方案?
您需要回调事件循环,以便在读取操作完成时通知您的应用程序。您不需要任何安全机制。一旦您将头部绕过倒置流量控制器,它就不是一个复杂的解决方案。有几个examples和一个tutorial向您展示如何编写异步I / O程序。如果遇到问题,请研究它们并在Stackoverflow上提问。
答案 1 :(得分:0)
asio::streambuf s_buf;
asio::async_read_until(sock, s_buf, '\n', std::bind(completionHandler, std::placeholders::_1));
std::string message;
std::istream input_stream(&s_buf);
std::getline(input_stream, message);
std::cout << message << std::endl;
// Whenever it successfully read an entire message ; it will call the function completion handler.
void completionHandler(const boost::system::error_code& ec)
{
if (ec != 0)
{
std::cout << "Error occured! Error code = " << ec.value() << ". Message: " << ec.message();
return;
}
}