c++ - 在读取之前检查 boost::asio 套接字上的数据?或者我应该使用 async_read()?

标签 c++ boost-asio

我是套接字 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 对象来控制套接字,然后我可以检查 bytes_readable::get() 是否返回大于零读取套接字。

看起来 async_read() 可以完成这项工作,但我必须承认我并不真正理解它。看起来我需要注册一个回调,这表明我可能需要在缓冲区周围放置一些安全机制。我认为这是一个更复杂的解决方案是否正确?

最佳答案

I'd like to check for data then move on if nothing is present

您刚刚描述了称为轮询的方法。

It looks like an async_read() might do the job, but I must admit I don't really understand it.

正确,async_read() 是这里的完美解决方案。

It looks like I'd need to register a callback, which suggests that I may then need to put some safety mechanism around the buffer. Am I right in thinking this is a more complex solution?

当读取操作完成时,您将需要事件循环的回调来通知您的应用程序。您不需要任何类型的安全机制。一旦您全神贯注于反向流量控制,这并不是一个复杂的解决方案。有几个examples和一个 tutorial向您展示如何编写异步 I/O 程序。研究它们并在遇到问题时在 Stackoverflow 上提问。

关于c++ - 在读取之前检查 boost::asio 套接字上的数据?或者我应该使用 async_read()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9830140/

相关文章:

c++ - Boost C++ UDP 示例无法通过互联网传输

c++ - 如何为 Boost.Asio 设计自定义 IO 对象

c++ - 不能用 boost beast 做 https 请求

java - 如何修复它才能捕获提到的 URL 格式?

c++ - 返回 Vector 的新实例

c++ - 从栈 move 到堆

c++ - Boost.Asio deadline_timer 没有按预期工作

c++ - 如何使用已经存在的 tcp::socket 创建一个 tcp::iostream?

c++ - 在抛出 'std::length_error' what(): basic_string::_S_create 实例后终止调用

c++ - 在 linux 中将 "plugins"放在哪里