libevent中关于bufferevent_socket_connect的使用小结

16.bufferevent客户端发送文件并处理超时和断开事件 linux下进行操作 makefile test:test.cpp g++ $^ -o $@ -levent ./$@ clean: rm -rf test rm -rf *.o 测试代码 #include <iostream> #include <event2/event.h> #include <event2/thread.h> #include<event2/listener.h> #in 阅读详情

经过多次代码测试,总结如下:

  1. bufferevent_socket_connect 返回0,不代表和服务器连接成功,返回-1一定是连接失败(简单看了下源码,的确大部分情况都是返回0,包括连接被拒绝等)
  2. 网线未插(wifi未连接),服务器没开,bufferevent_socket_connect立即返回0,但在后台继续请求连接(前提socket已被设置成非阻塞),若无进一步操作,将在130秒后,报错:110-Connection timed out
  3. 在上述状态下,若先插网线,再开服务器,几秒之后,可以成功建立连接,也有可能报错:113-No route to host
  4. 在上述状态下,若先开服务器,再插网线,十几秒之后,报错:113-No route to host
  5. 网络连接已正常,服务器没开,立即报错:111-Connection refused
  6. 网络连接正常状态下,若服务器关闭,则BEV_EVENT_EOF事件触发,客户端可通过该事件确认服务器被关闭
  7. 上述所有错误都会产生BEV_EVENT_ERROR事件,且触发event_cb回调,客户端可在event_cb回调函数中处理这些错误信息,包括网络重连,或向HMI显示网络问题,或将这些信息输出到系统日志
  8. bufferevent_free会关闭套接字(BEV_OPT_CLOSE_ON_FREE开启情况下),如果该套接字正在进行connect,则会立即结束。不过,测试发现不会立即释放该sockfd,比如刚关闭的套接字sockfd=9,free掉之后,该sockfd关闭,但此时若新建sockfd,则sockfd=10,而不是9.
  9. 通过socket() 和 connect() 创建套接字以及建立连接时,默认是阻塞的,一种处理方法是通过定时器终止connect以避免阻塞,不过该方法对bufferevent_socket_connect无效(当传入的sockfd是阻塞的时候),SIGALAM触发了之后,仍继续connect,netstat查看,的确还在SYN_SENT状态。故需要使用上述第8点方法,若超时未连接上,又无错误返回,直接bufferevent_free,然后重连
  10. event_base_new在主线程创建base, bufferevent_socket_new在子线程创建bufferevent监听网口(以及event_new也在子线程创建event事件进行串口、CAN口监听),此时需开启libevent的多线程支持功能,否则无法将event或bufferevent添加到base。Linux下开启多线程支持需以下三句代码:
evthread_use_pthreads();
base = event_base_new();
evthread_make_base_notifiable(base);

2021-5-16 更新

前几天调试外设时,在一个非正常的,实际不会发生的工况下模拟测试时,发现一个怪异的问题:

event_base_new在主线程创建,另起一个线程进行bufferevent_socket_new、bufferevent_socket_connect,然后等待回调bev_event_cb执行,检查是否连接成功,此时,如果主线程休眠了,bev_event_cb貌似不会立即回调,而是等到主线程休眠结束后才回调……

由于时间紧迫,而且libevent这块儿框架基本都写好了,就懒得继续深入测试分析了,先记下来再说,以后有空再研究吧。

2021-8-2 更新
当bufferevent连接成功后,客户端正常发送数据,服务器正常接收,在未开启接收超时的情况下。此时,如果将网线拔出来,客户端和服务器都不会报错(event_cb不会被回调,因此在event_cb中写的网络重连逻辑也不会被触发)。bufferevent_write仍然返回0,也即写入成功(写入发送缓冲区)。

一段时间后,重新插上网线。此时,服务器将接收到一堆数据,该数据为网线拔出来之后,客户端写入发送缓冲区但没有被服务器接收的数据。接收完毕之后,恢复正常通讯在这里插入图片描述
上图中,客户端每秒发送一串字符串“Hello,this is a test for bufferevent_write function!”,中途将网线拔出,一段时间后再插上,接收到一堆字符串后,再次恢复到正常通讯状态。

因此,目前通过设置接收超时(bufferevent_set_timeouts)来判断网络连接是否正常,若在设定的时间内没有收到服务器发送的数据,则认为网络断开,关闭bufferevent后重连。

ESP32-S3开发环境避坑指南:VS Code+ESP-IDF离线安装全流程(附国内镜像加速) 本文提供了一份详细的ESP32-S3开发环境离线安装指南,重点解决网络依赖问题。通过整合国内镜像加速,手把手教你完成VS Code、ESP-IDF框架、工具链及Python依赖的本地化部署,实现稳定、可重复的开发环境搭建,大幅提升IoT开发效率。 阅读详情

相关推荐

中文实体关系抽取数据集大盘点:从百度Duie2.0到医疗CBLUE,哪个更适合你的NLP项目?

本文全面分析了中文实体关系抽取领域的主流数据集,包括百度DuIE 2.0、医疗CBLUE等,帮助开发者根据项目需求选择最适合的数据集。文章详细对比了各数据集的特点、适用场景及优化策略,为自然语言处理项目提供实用指南。

weixin_29284657的博客 121

BufferEvent

bufferevent   由于我们在网络通信中有很多输入输出的场景,所以Libevent也提供了相应的bufferevent。这些bufferevent由一个底层的传输对象(socket),一个ReadBuufer,一个WriteBuffer构成。   与之前普通的event不同的是bufferevent只有当它的传输对象(fd)读取到了足够多的数据后才会调用它的回调函数。   buffe...

我喜欢雨天的清新的博客 3312

Groq LPU架构解析:确定性线性处理器如何重塑AI推理

语言模型推理正从‘通用算力堆叠’转向‘确定性硬件定制’。LPU(Language Processing Unit)作为一种面向大模型推理的领域专用处理器,摒弃传统GPU的并行调度、多级缓存与动态执行范式,转而采用空间计算、静态编译与单线程线性流水线设计,实现纳秒级延迟可控性和92%+的HBM带宽利用率。其核心价值在于将模型结构、内存访问、时序路径全部在编译期固化,从而消除运行时抖动——这正是当前MLOps工程师应对A100显存碎片、vLLM调度开销与P99延迟不稳等痛点的关键技术路径。Groq 3 LPU与

weixin_30599521的博客 327

   bufferevent_socket_connect

bufferevent_socket_connect函数会调用socket函数申请一个套接字fd,然后把这个fd设置成非阻塞的(这就导致了一些坑爹的事情)。接着就connect服务器,因为该socket fd是非阻塞的,所以不会等待,而是马上返回,连接这工作交给内核来完成。所以,返回后这个socket还没有真正连接上服务器。那么什么时候连接上呢?内核又是怎么通知通知用户呢? 一般来说,当可以往socket fd写东西了,那就说明已经连接上了。也就是说这个socket fd变成可...

qixiang2013的专栏 1221

曙光服务器RAID配置避坑指南:MegaRAID SAS 9361-8i实战(含Foreign状态处理)

本文详细解析了曙光服务器搭配MegaRAID SAS 9361-8i控制器的RAID配置全流程,包括RAID0和RAID5的创建、Foreign状态处理及性能优化策略。特别针对磁盘迁移中的Foreign状态问题,提供了系统化的解决方案和高级恢复技巧,助力企业级IT运维提升存储配置的稳定性和可靠性。

weixin_29200741的博客 412

视觉机器人抓取实战:从物体定位到抓取估计的完整流程解析(附Python代码示例)

本文详细解析了视觉引导机器人抓取的完整技术流程,涵盖从物体定位、位姿估计到抓取估计的核心步骤。通过Python代码示例,演示了如何使用Open3D等工具进行点云处理、平面分割、PCA与ICP位姿估计,以及基于几何启发式的抓取生成方法,为机器人视觉抓取开发提供了清晰的实战指南。

peach的博客 913

libevent库bufferevent事件实现socket通信

bufferevent 事件开发框架 服务器端: 创建event_base :event_base_new() 创建监听服务器, 设置其监听回调函数,当有客户端成功连接时,这个回调函数会被调用 :evconnlistener_new_bind() 监听服务器回调函数 listener_cb() 内部 添加bufferevent事件 实现通信 :bufferevent_socket_new() bufferevent事件的 read、write、event 事件设置回调函数:bufferevent_setc

one goto one 的博客 1108

思科模拟器实战:MQTT协议实现物联网设备通信全流程解析

本文详细解析了如何在思科模拟器中利用MQTT协议实现物联网设备通信的全流程。通过搭建网络拓扑、配置MQTT Broker与客户端,并编写发布/订阅逻辑,手把手指导读者完成一个“开关控制电灯”的经典物联网场景实验,帮助零成本掌握物联网通信核心。

weixin_29294975的博客 381

Libevent之 bufferevent 及 bufferevent_sock 详解

通常已连接的套接字除了相应事件之外,应用还希望做一定的数据缓冲。决定要向连接写入一些数据,把数据放入到缓冲区中。等待连接可以写入。写入尽量多的数据。记住写入了多少数据,如果还有更多数据要写入,等待连接再次可以写入。这种缓冲IO模式很通用,libevent为此提供了一种通用机制即。由一个底层的传输端口(如已连接套接字)、一个读取缓冲区和一个写入缓冲区组成。与通常的事件在底层传输端口已经就绪,可以读取或者写入的时候执行回调不同的是,在读取或者写入了足够量的数据之后再调用用户提供的回调。用户通过。

一个菜鸟的博客 6547

基于图像形态学处理的交通灯检测识别matlab仿真

图像形态学处理是基于数学形态学的理论,利用结构元素(如矩形、圆形等)对图像进行处理,通过将结构元素与图像进行特定的逻辑运算,来提取图像中的目标特征、去除噪声、改善图像质量等。在交通灯检测识别中,主要利用交通灯的颜色、形状等特征,通过形态学操作突出这些特征,抑制背景和噪声干扰,从而实现对交通灯的准确检测和识别。图像采集与预处理采集:通过安装在车辆或道路上的摄像头获取交通场景图像。灰度化:将彩色图像转换为灰度图像,减少数据量,便于后续处理。

平时工作较为繁忙,私信消息一般晚上回复,谢谢大家~~ 160

【一看就会】autoware universe项目结构解析——从一层一层直到control源码

下载安装autoware universe花了一天。下载好之后,按照网上说的跑了一下仿真是能跑的,证明下的代码没问题。然后就得看一下各模块实现的源码了。但是当我打开这些文件的时候。我勒个豆。这么多是个玩意儿。我连该启动哪个launch文件,哪个文件夹是干啥的都不知道。在我慢慢弄懂之后,我也记录这个庞大的项目的各个文件夹和里面的文件以及项目,以及自己使用时应该启动哪些launch文件。这篇文章目的就是通过找到control部分的源码,来帮助我们梳理这个庞大项目的各个文件的功能。

weixin_48386130的博客 2037

C++ Libevent 高级事件bufferevent

bufferevent 相比于 event 比较高级的事件 bufferevent有 三个事件 当数据从底层的缓冲区 拷贝到应用层缓冲区,触发读回调(事件) 当应用层缓冲区写入到底层缓冲区,触发写回调 当你的连接 连接与断开,会触发事件回调 总结 1个文件描述符 2个缓冲区(应用层) 3个事件回调 普通event 0个缓冲区 1个回调, 不管读写,触发的都是一个回调函数 buffevent 常用的 api 1.bufferevent_socket_new struct bufferevent

_Tsun 的博客 965

AM芯片性能测试

目前车载FM&AM没有明确的国标,因此各家测试项目可能不同,最主要测试标准比较混乱,多是根据具体芯片的规格书以及与芯片厂商协商。信号发生器:R&S SMCV100B音频分析仪:R&S UPV AUDIO AYALYZER DC 250KHZ(AP的也可以)专用USB-I2C控制模块(不同芯片控制模块不同,例如SPI或UART的控制模块)卡农线(针对模拟声道输出,+接左/右声道,-接GND,地可接GND也可悬空)

qflook的博客 902

LibEvent中文帮助文档--第10章【Bufferevent 概念和入门】

LibEvent中文帮助文档:http://blog.youkuaiyun.com/zhouyongku LibEvent快速可移植非阻塞式网络编程

zhouyongku的专栏 4264

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

libevent中bufferevent事件及常用的API函数

bufferevent实际上也是一个event,只不过比普通的event高级,他的内部有两个缓冲区,以及一个文件描述符(网络套接字)。一个网络套接字有读写两个缓冲区,bufferevent同样也带有两个缓冲区。所以有四个缓冲区。

luosuss的博客 1669

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

bufferevent有关介绍与使用

bufferevent有关介绍与使用

qq_46312211的博客 2670

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Libevent实现TCP流程

4、使用bufferevent_setcb()给bufferevent对象的read、write、event设置回调。4、回调函数被调用,说明有一个新客户端连接上来。会得到一个新fd(文件描述符),用于跟客户端通信(读、写)其一旦被回调,说明在其内部应该与客户端完成,数据读写操作,进行通信。该回调函数,不由我们调用,是框架自动调用。创建一个新的bufferevent事件,将fd封装到这个事件对象中。给这个事件对象的read、write、event设置回调。的回调函数中,处理接受连接后的操作。

BSY丶的博客 1626

Libevent(4)— Bufferevent

转自: http://name5566.com/4215.html 参考文献列表: http://www.wangafu.net/~nickm/libevent-book/ 此文编写的时候,使用到的 Libevent 为 2.0.21 Buffer IO 模式 bufferevent 提供给我们一种 Buffer IO 模式(这里以写入数据为例): 在我们需要通过某

xulystone的专栏 639

libevent源码IV--bufferevent概念

bufferevent基础和概念 Libevent为这种带缓存的IO模式提供了一个通用的机制。一个”bufferevent”包含一个底层传输(比如socket),一个读buffer和一个写buffer。当底层传输可读写时就调用回调函数,这是普通事件的处理,而bufferevent是在读或写足够的数据时才调用用户指定的回调函数。 每个bufferevent都有一个输入缓存和一个输出缓存,对应的数...

风吹日落噎死青春 255

client用bufferevent

本文介绍了libevent中bufferevent_socket的基本用法。主要内容包括:bufferevent封装了套接字I/O,通过event_base事件循环驱动;关键API bufferevent_socket_new用于创建对象,bufferevent_socket_connect用于非阻塞连接;给出了IPv4连接的完整示例代码;总结了使用要点,包括回调设置顺序、超时控制、水位线设置等;并提供了带DNS解析的连接方法。文章最后给出了标准使用流程和进阶建议,如TLS支持、背压控制等。帮助开发者快速掌

apple_68404559的博客 441

Libevent3——bufferevent上创建socket通信的服务器端、客户端的流程、及服务器端、客户端的代码实现分析⛽

libevent实现Tcp服务器流程 1,创建event_base 2,创建服务器连接监听器evconnlistener_new_bind() 3,在evconnlistener_new_bind的回调函数中,处理接收连接后的操作 4,回调函数被调用,说明一个新客户端连接上来,会得到一个新的用于跟客户端通信(读写)的fd 5,将新的fd封装到新事件中:用bufferevent_socket_new()创建一个新的bufferevent事件,将fd封装到这个事件对象中 6,设置封装了fd事件的回调函数:使用b

qq_37299596的博客 776

Libevent学习记录(4)

Libevent学习记录(4)Libevent常用API:三、监听器evconnlistener相关API1、evconnlistener_new_bind2、evconnlistener_cb监听回调函数原型:四、evBuffer介绍1、struct evbuffer* 变量的赋值2种方式2、与evbuffer相关的常用函数API五、数据缓冲bufferevent相关API1、创建基于套接字的bufferevent:bufferevent_socket_new2、释放bufferevent:buffere

weixin_53811793的博客 857

利用bufferevent_socket_connect()建立网络连接

libevent为我们供给了一个很便利的组件bufferevent,可以将底层的通信接口抽象为缓存操纵,可以使我们无须本身再直接处理惩罚 套接口的发送和接管,并在其上供给读、写、事务回调,具体的文档可参考([翻译]libevent参考手册第六章:bufferevent:概念和入门) 是一份官方文档的翻译,然则该文章中没有说清楚bufferevent的触发前提,仅说了凹凸水位触发等景象,我想知道的是...

weixin_30438813的博客 814

Libevent安装与使用(二)

Bufferevents Every bufferevent has an input buffer and an output buffer. These are of type "struct evbuffer". When you have data to write ona bufferevent, you add it to the output buffer; when a ...

dh6226的博客 196

08libevent库下通信服务端与客户端的主要函数

08libevent库下通信服务端与客户端的主要函数 1 服务端的主要函数 1)evconnlistener_new(),该函数了解一下即可,它的功能相当于new一个监听者对象而已,并无实际封装,你看参6fd就知道,仍然需要自己socket()的返回值传参。所以主要用下面那个。 struct evconnlistener * evconnlistener_new( struct event_base *base,

weixin_44517656的博客 405

libevent 搭建服务相关

转载自:http://www.cppblog.com/mysileng/archive/2013/02/05/197740.html 很多时候,除了响应事件之外,应用还希望做一定的数据缓冲。比如说,写入数据的时候,通常的运行模式是: l 决定要向连接写入一些数据,把数据放入到缓冲区中 l 等待连接可以写入 l 写入尽量多的数据 l 记住写入了多少数据,如果还有更多数据

qingfenglu的专栏 2503
上一篇: PIMPL实现——通过this指针和接口纯虚函数实现客户端代码调用
下一篇: linux下socketCAN实现反转过滤——CAN_INV_FILTER的使用
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值