我正在尝试使用boost::asio将我用Unix套接字编写的软件移植到使用TCP套接字的版本。该程序旨在在Linux机器上运行。
在早期版本的代码(使用Unix套接字)中,我使用了一个简单的检查来查看套接字缓冲区上是否有新数据,然后继续读取可预测的结构化数据:
ioctl(s_c, FIONREAD, &socketstatus);
while (socketstatus > 0)
{// do receive stuff
ioctl(s_c, FIONREAD, &socketstatus);}
是否有办法做一些类似的boost::asio?或者有更好的选择?
提前谢谢你CB
使用bytes_readable,这实现了你想要的。
执行FIONREAD IO控制命令。
boost::asio::ip::tcp::socket socket(io_service);
...
boost::asio::socket_base::bytes_readable command(true);
socket.io_control(command);
std::size_t bytes_readable = command.get();
您可以使用native()
方法从boost::asio::ip::tcp::socket
提取本机描述符,这应该可以很好地与您现有的代码一起工作。
不过,我怀疑你这样做的动机。Asio事件反应器在Linux上使用epoll
实现轮询机制。在io_service
事件循环之外,应该不需要轮询套接字来读取或写入。