我是套接字 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/