首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何使用asio执行非阻塞读取?

非阻塞读取是异步I/O操作,使用asio库可以轻松实现。以下是一个简单的示例,展示了如何使用asio执行非阻塞读取:

代码语言:cpp
复制
#include<iostream>
#include<boost/asio.hpp>

void read_handler(const boost::system::error_code& ec, std::size_t bytes_transferred) {
    if (!ec) {
        std::cout << "成功读取 "<< bytes_transferred << " 字节数据。"<< std::endl;
    } else {
        std::cout << "读取错误: " << ec.message()<< std::endl;
    }
}

int main() {
    boost::asio::io_context io_context;
    boost::asio::ip::tcp::socket socket(io_context);
    socket.connect(boost::asio::ip::tcp::endpoint(boost::asio::ip::address::from_string("127.0.0.1"), 8080));

    boost::asio::streambuf buffer;
    std::ostream request_stream(&buffer);
    request_stream << "GET / HTTP/1.1\r\n";
    request_stream << "Host: 127.0.0.1\r\n";
    request_stream << "Connection: close\r\n\r\n";

    socket.write_some(buffer.data());

    buffer.consume(buffer.size());

    socket.async_read_some(buffer.prepare(1024), read_handler);

    io_context.run();

    return 0;
}

在这个示例中,我们首先创建了一个io_context对象,并使用它来管理异步操作。然后,我们创建了一个TCP套接字,并连接到指定的IP地址和端口。

接下来,我们创建了一个streambuf对象,并使用它来构建HTTP请求。我们将请求写入套接字,并使用async_read_some方法异步读取响应。最后,我们调用io_context的run方法来启动异步操作。

当异步读取完成时,read_handler回调函数将被调用。如果读取成功,我们将输出读取到的字节数。如果发生错误,我们将输出错误消息。

这个示例展示了如何使用asio执行非阻塞读取,但是实际应用中,您可能需要根据具体的需求进行调整。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

阻塞与非阻塞的区别verilog_如何理解阻塞和非阻塞

send做的工作其实只是把数据传输(Copy)到TCP/IP协议栈的输出缓冲区,它执行成功并不代表数据已经成功的发送出去了,如果TCP/IP协议栈没有足够的可用缓冲区来保存你Copy过来的数据的话…这时候就体现出阻塞和非阻塞的不同之处了...这里提到执行部件和调用者通过三种途径返回结果:状态、通知和回调。可以使用哪一种依赖于执行部件的实现,除非执行部件提供 多种选择,否则不受调用者控制。...如果是使用通知的方式,效率则很高,因为执行部件几乎不需要做额外的操作。至于回调函数,其实和通知 没太多区别。 阻塞 阻塞调用是指调用结果返回之前,当前线程会被挂起。...非阻塞 非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。...阻塞对象上可以有非阻塞的调用方式,我们可以通过一定的API去轮询状态,在适当的时候调用阻塞函数,就可以避免阻塞。而对于非阻塞对象,调用特殊的函数也可以进入阻塞调用。

2.3K20

【i.MX6ULL】驱动开发10——阻塞&非阻塞式按键读取

,但因平时读取不到按键值,按键应用程序被阻塞住了,CPU的使用权被让出,自然CPU的使用率就降下来了。...2 非阻塞I/O方式的按键检测 按键应用程序以非阻塞的方式读取,按键驱动程序也要以非阻塞的方式立即返回。...注意open函数的参数是O_NONBLOCK,即非阻塞访问,并且为了在测试时看出阻塞读取与非阻塞读取的区别,在poll函数前后添加打印,如果程序正常运行,poll函数则不会被阻塞,500ms超时未读取到按键值后会再次循环读取...按键程序在后台运行,此时使用top指令开查看CPU的使用率,可以发现非阻塞式按键驱动这种方式,CPU的暂用率也几乎为0,虽然按键应用程序中仍实现循环读取的方式,但poll函数有500ms的超时设置,在超时等待的时间里...使用ps指令查看poll方式的按键进行号,使用kill杀带该进程,再运行select方式的按键应用程序: select非阻塞读取的方式,CPU的暂用率也几乎为0: 3 总结 本篇使用两种I/O模型进行按键读取

58920
  • Linux:如何使用非登录系统用户执行命令

    Linux系统中,管理员经常需要通过一个无法登录shell的系统用户来执行特定的命令。这种需求在管理多用户系统或自动化任务时尤为常见。下面,我们将详细讲解如何实现这一需求,并深入分析其背后的原理。...使用sudo命令 sudo命令是Linux中执行命令的常用工具,它允许授权的用户以其他用户的身份(包括root)执行命令。要让非登录用户执行命令,我们可以使用sudo命令。...执行命令:现在,我们可以使用以下命令格式来以非登录用户身份执行命令: bash sudo -u 3....步骤: 切换用户:使用以下命令格式以非登录用户身份启动bash会话: bash su -s /bin/bash 执行命令:在新启动的bash会话中,我们可以执行任何需要的命令...结论 Linux系统管理员可以通过sudo命令或su -s /bin/bash命令,实现以非登录用户身份执行命令的需求。这些方法既灵活又强大,但也需要管理员谨慎使用,以确保系统安全。

    30310

    Linux 的 epoll 使用 LT + 非阻塞 IO 和 ET + 非阻塞 IO 有效率上的区别吗?

    他的问题: Linux 的 epoll 使用 LT + 非阻塞 IO 和 ET + 非阻塞 IO 有效率上的区别吗? 问题补充:请看清楚。。...都是非阻塞IO,这是否意味着他们的系统调用次数基本是一致的?那么ET+非阻塞存在的意义是什么呢?...可写 => socket可写 2. socket不可写 => socket可写 socket 可写事件边缘模式触发条件: 1. socket不可写 => socket可写 也就是说,如果对于一个非阻塞...setsockopt(listenfd, SOL_SOCKET, SO_REUSEPORT, (char*)&on, sizeof(on)); //将监听socker设置为非阻塞的...,可写事件触发后,你调用 send 函数(Linux 平台也可以使用 write)去发送数据,如果数据本次不能全部发送完(对于非阻塞的 socket,此时 send 函数返回 -1,错误码为 EAGAIN

    2.4K51

    如何给女朋友解释什么是IO中的阻塞、非阻塞、同步、异步?

    同步、异步、阻塞、非阻塞都是和IO(输入输出)有关的概念。最简单的文件读取就是IO操作。而在文件读取这件事儿上,可以有多种方式。 又拽概念了,你先给我说说啥叫同步、啥叫异步。 ?...所以说,同步和异步最大的区别就是被调用方的执行方式和返回时机。同步指的是被调用方做完事情之后再返回,异步指的是被调用方先返回,然后再做事情,做完之后再想办法通知调用方。...阻塞、非阻塞说的是调用者,同步、异步说的是被调用者。 有人认为阻塞和同步是一回事儿,非阻塞和异步是一回事。但是这是不对的。 先来看同步场景中是如何包含阻塞和非阻塞情况的。 我们是用传统的水壶烧水。...再来看异步场景中是如何包含阻塞和非阻塞情况的。 我们是用带有提醒功能的水壶烧水。在水烧发出提醒之前我们一直做在水壶前面,等着水开。这就是阻塞的。 我们是用带有提醒功能的水壶烧水。...BIO (Blocking I/O):同步阻塞I/O模式,数据的读取写入必须阻塞在一个线程内等待其完成。 NIO (New I/O):同时支持阻塞与非阻塞模式,但主要是使用同步非阻塞IO。

    94931

    使用epoll时需要将socket设为非阻塞吗?

    当 connfd 被设置成非阻塞模式,无论连接是否建立成功,connect 函数都会立刻返回,那如何判断 connect 函数是否连接成功呢?...四、使用 epoll 模型是否要将 socket 设置成非阻塞的 答案是需要的。 epoll 模型通常用于服务端,那讨论的 socket 只有 listenfd 和 clientfd 了。...listenfd 为什么一定要设置成非阻塞的,我在另外一篇文章中写的很清楚: 高性能网络通信库中为何要将侦听 socket 设置成非阻塞的?...318 4.6.1 如何将socket设置为非阻塞模式 318 4.6.2 send和recv函数在阻塞和非阻塞模式下的表现 320 4.6.3 非阻塞模式下send和recv函数的返回值总结 331...4.6.4 阻塞与非阻塞socket的各自适用场景 333 4.7 发送0字节数据的效果 333 4.8 connect函数在阻塞和非阻塞模式下的行为 339 4.9 连接时顺便接收第1组数据 343

    2.4K10

    使用CompletionService非阻塞获取多线程返回值

    利用future及时获取线程运行结果的方法有两种,第一种利用Future的isdone()和get()结合获取,第二种利用java的concurrent包中的CompletionService提供的方法非阻塞获取...从而实现了非阻塞的任务调用。在途中遇到一个问题,那就是虽然能异步获取结果,但是Future的结果需要通过isdone来判断是否有结果,或者使用get()函数来阻塞式获取执行结果。...有一种更好的方式来实现对任意一个线程运行完成后的结果都能及时获取的办法:使用CompletionService,它内部添加了阻塞队列,从而获取future中的值,然后根据返回值做对应的处理。...利用Future的get()方法阻塞式获取 /** * 多线程执行,异步获取结果 */ public class AsyncThread { public static void main(...CompletionService非阻塞获取多线程返回值 public static void main(String[] args) { try { completionServiceCount

    1.8K20

    漫话:如何给女朋友解释什么是IO中的阻塞、非阻塞、同步、异步?

    同步、异步、阻塞、非阻塞都是和IO(输入输出)有关的概念。最简单的文件读取就是IO操作。而在文件读取这件事儿上,可以有多种方式。 又拽概念了,你先给我说说啥叫同步、啥叫异步。 ?...所以说,同步和异步最大的区别就是被调用方的执行方式和返回时机。同步指的是被调用方做完事情之后再返回,异步指的是被调用方先返回,然后再做事情,做完之后再想办法通知调用方。...阻塞、非阻塞说的是调用者,同步、异步说的是被调用者。 有人认为阻塞和同步是一回事儿,非阻塞和异步是一回事。但是这是不对的。 先来看同步场景中是如何包含阻塞和非阻塞情况的。 我们是用传统的水壶烧水。...再来看异步场景中是如何包含阻塞和非阻塞情况的。 我们是用带有提醒功能的水壶烧水。在水烧发出提醒之前我们一直做在水壶前面,等着水开。这就是阻塞的。 我们是用带有提醒功能的水壶烧水。...BIO (Blocking I/O):同步阻塞I/O模式,数据的读取写入必须阻塞在一个线程内等待其完成。 NIO (New I/O):同时支持阻塞与非阻塞模式,但主要是使用同步非阻塞IO。

    85340

    linux网络编程系列(七)--如何将socket设置成非阻塞的,非阻塞socket与阻塞的socket在收发数据上的区别

    使用fcntl设置 将socket设置为非阻塞的 if ((nFlags = fcntl (nSock, F_GETFL, 0)) < 0) return 0; nFlags = nFlags...非阻塞和阻塞在收发数据时有什么区别 3.1 发送时的区别 3.1.1 TCP发送(即send函数) send函数在阻塞模式下,会等待所有数据都被拷贝到发送缓冲区才会返回,也就是说,阻塞模式下,send函数返回值必定是参数中发送长度的大小...; send函数在非阻塞模式下,会立即返回,但是会尽可能的多拷贝数据到缓冲区,但不保证全部拷贝后返回,因此非阻塞模式下,send函数返回值可能比参数中发送长度小,而如果缓冲区满了的话,就会立即返回; 3.1.2...非阻塞模式也一样。...3.2 接收时的区别 3.2.1 TCP接收(即recv函数) 在阻塞模式下, recv将会阻塞,直到缓冲区里有至少一个字节才返回,当没有数据到来时,recv会一直阻塞或者直到超时,不会返回; 在非阻塞模式下

    3.5K30

    Linux下Socket编程(三)——非阻塞select的使用简介

    简介 什么叫阻塞和非阻塞 select fd_set类型的变量相关宏定义 fcntl 实例 select总是返回1的问题。...什么叫阻塞和非阻塞 阻塞方式block,顾名思义,就是进程或是线程执行到这些函数时必须等待某个事件的发生,如果事件没有发生,进程或线程就被阻塞,函数不能立即返回。...使用Select就可以完成非阻塞(所谓非阻塞方式non- block,就是进程或线程执行此函数时不必非要等待事件的发生,一旦执行肯定返回,以返回值的不同来反映函数的执行情况,如果事件发生则与阻塞方式相同...readfds 这个集合中应该包括文件描述符,我们是要监视这些文件描述符的读变化的,即我们关心是否可以从这些文件中读取数据了,如果这个集合中有一个文件可读,select就会返回一个大于0的值,表示有文件可读...一定等到监视文件描述符集合中某个文件描述符发生变化为止 若将时间值设为0秒0毫秒,就变成一个纯粹的非阻塞函数,不管文件描述符是否有变化,都立刻返回继续执行,文件无变化返回0,有变化返回一个正值 timeout

    4.3K10

    MongoDB网络传输层模块源码实现二

    说明 在之前的>一文中分析了如何阅读百万级大工程源码、Asio网络库实现、transport传输层网络模块中线程模型实现,但是由于篇幅原因...//如果是异步线程模型,在ASIOSession构造初始化的时候会设置non_blocking非阻塞模式 //异步线程模型这里实际上是非阻塞读取,如果是同步线程模型,则没有non_blocking...如果是同步线程模型,则这里为阻塞式读取,直到读到size字节才会返回;如果是异步线程模型,这这里是非阻塞读取,非阻塞读取当内核网络协议栈数据读取完毕后,如果还没有读到size字节,则继续进行async_read...异步模式则非阻塞写 auto size = asio::write(stream, buffers, ec); //异步写如果返回try_again说明数据还没有发送完,...,也分位同步模式发送和异步模式发送,同步模式发送为阻塞式写,只有当所有数据通过asio::write()发送成功后才返回;异步模式发送为非阻塞写,asio::write()不一定全部发送出去,因此需要再次调用

    1.4K20

    按照缓冲区的顺序,分散读取和非阻塞式网络通信区别

    分散读取 分散读取(Scattering Reads)是指从Channel 中读取的数据“分散”到多个Buffer 中。...flip(); byteBuffer2.flip(); // 聚集写入 outChannel.write(byteBuffers); } } 非阻塞式网络通信...阻塞 I/O 好⽐, 你去饭堂吃饭,但是饭堂的菜还没做好,然后你就⼀直在那⾥等啊等, 等了好⻓⼀段时间终于等到饭堂阿姨把菜端了出来(数据准备的过程), 但是你还得继续等阿姨把菜(内核空间)打到你的饭盒...⾮阻塞 I/O 好⽐, 你去了饭堂,问阿姨菜做好了没有,阿姨告诉你没, 你就离开了,过⼏⼗分钟,你⼜来, 饭堂问阿姨,阿姨说做好了,于是阿姨帮你把菜打到你的饭盒⾥,这个过程你是得等待的。...基于⾮阻塞的 I/O 多路复⽤好⽐, 你去饭堂吃饭,发现有⼀排窗⼝,饭堂阿姨告诉你这些窗⼝都还没做好菜, 等做好了再通知你,于是等啊等( select 调⽤中),过了⼀会阿姨通知你菜做好了, 但是不知道哪个窗

    30010

    在 CC++ 异步 IO 中使用 MariaDB 的非阻塞接口

    同时,这也便于在同一个代码目录中混合使用阻塞和非阻塞调用架构。...正常情况下,应用程序不需要修改这个值,可以传入 0 以使用默认值。 --- 混合阻塞和非阻塞操作 在同一个 MYSQL 连接中混合使用阻塞和非阻塞操作是完全可行的。...因此,应用程序可以做普通的阻塞式的 mysql_real_connect(),然后依序执行一个非阻塞的 mysql_real_query_start()。...反之亦然:先做一个非阻塞的 mysql_real_connect_start(),然后晚些时间执行后续的 mysql_real_query()。...混合操作允许代码在发生忙等待也影响不大的地方使用较为简单的的阻塞式 API 时非常有用。比如在程序启动的时候建立连接,或者是在多个大型的、长耗时的查询中,执行短且快的小型查询。

    3.4K20

    ElasticMQ 0.7.0:长轮询,使用Akka和Spray的非阻塞实现

    Akka和Spray的非阻塞实现 ElasticMQ 0.7.0,一个附带基于actor的Scala的消息队列系统刚刚发布。...像以前一样,您也可以使用任何基于JVM的语言来运行嵌入式服务器。 实现说明 出于好奇,下面是对ElasticMQ如何实现的简短描述,包括核心系统,REST层,Akka数据流使用和长轮询实现。...除了基于角色的非阻塞IO实现外,Spray还提供了强大的路由库spray-routing。...如何使用路由中的队列角色(queue actors)来完成HTTP请求? 关于Spray的RequestContext好处是,它所做的只是将一个实例传递给你的路由,不需要任何回复。...这看起来像完全正常的序列化代码,但是在执行时,因为第一次Future是第一次使用将会异步运行。 长轮询 由于所有的代码都是异步和非阻塞的,实现长轮询非常容易。

    1.6K60
    领券