libevent设置超时后取消超时(bufferevent_set_timeouts取消超时无效问题)

2023-05-16

libevent用 bufferevent_set_timeouts 函数来设置读和写的超时时间timeout,比如设置读超时时间,如果接收超时就会调用设置的错误处理函数。以tcp服务器为例,在accept的时候设置接收超时,但对某写tcp client不能设置接收超时(这个时候就需要取消accept的时候设置的接收超时)。查看 bufferevent_set_timeouts 的源码,超时时间参数传入NULL就会清掉对应的读或者写的超时时间设置,实际测试发现调用bufferevent_set_timeouts 传入NULL,并没有效果,依然会产生超时timeout事件。

那么该如何在设置超时后再次取消超时呢?

正确的做法是,在超时timeout事件处理函数里面,调用 bufferevent_set_timeouts 来取消超时设置,并且enable read事件。

完整的例子如下,红色部分就是取消超时设置:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <ctype.h>
#include <arpa/inet.h>
#include <signal.h>
#include <errno.h>
#include <sys/wait.h>
#include <event2/event.h>
#include <event2/bufferevent.h>
#include <event2/listener.h>
#define SERVERPORT 8888
#define MAXBYTES 1024
 
static struct event_base * base;
int st =0;
void write_buf_cb(struct bufferevent* bev, void* cbarg)
{
    printf("%s\n", __FUNCTION__);
}
 
void read_buf_cb(struct bufferevent* bev, void* cbarg)
{
    int ret, i;
    char buf[MAXBYTES];
    ret = bufferevent_read(bev, buf, sizeof(buf));
    printf("read_buf_cd length %d\n", ret);
    for(i = 0; i < ret; i++)
    {
        buf[i] = toupper(buf[i]);
    }
    bufferevent_write(bev, buf, ret);
    
}
 
 
void event_cb(struct bufferevent* bev, short event, void* cbarg)
{
    if(BEV_EVENT_READING & event)
        puts("BEV_EVENT_READING");
    
    if(BEV_EVENT_WRITING & event)
        puts("BEV_EVENT_WRITING");
 
    if(BEV_EVENT_ERROR & event)
        puts("BEV_EVENT_ERROR");
 
    if(BEV_EVENT_EOF & event)
    {
        puts("BEV_EVENT_EOF");
        bufferevent_free(bev);
    }
    if(BEV_EVENT_TIMEOUT & event)
    {
        puts("timeout");
        bufferevent_set_timeouts(bev, NULL, NULL);  
        bufferevent_enable (bev, EV_READ);
    }

}
 
 
void  accept_cb(struct evconnlistener *listener,
            evutil_socket_t clientfd, struct sockaddr *addr
            , int len, void *arg)
{
    
    struct bufferevent* bev;
    struct event_base* base = (struct event_base*)arg;
    puts("Accept client connect");
 
    evutil_make_socket_nonblocking(clientfd);
    bev = bufferevent_socket_new(base, clientfd, BEV_OPT_CLOSE_ON_FREE
            | BEV_OPT_DEFER_CALLBACKS);
    bufferevent_setcb(bev, (bufferevent_data_cb)read_buf_cb
            , (bufferevent_data_cb)write_buf_cb, (bufferevent_event_cb)event_cb, NULL);
 
    struct timeval timeout_read = {10, 0};
    bufferevent_set_timeouts(bev, &timeout_read, NULL);  
    bufferevent_setwatermark(bev, EV_READ, 1, 0);
    bufferevent_setwatermark(bev, EV_WRITE, 1, 0);
 
    bufferevent_enable(bev, EV_READ | EV_WRITE);
}
 
void main_loop(struct sockaddr_in * addr)
{
    
    struct evconnlistener *evcon;
    base = event_base_new();
    evcon = evconnlistener_new_bind(base, (evconnlistener_cb)accept_cb
            , (void*)base, LEV_OPT_CLOSE_ON_FREE | LEV_OPT_REUSEABLE
            , 128, (struct sockaddr*)addr, sizeof(struct sockaddr_in));
 
    puts("server begin listenning...");
 
 
    event_base_dispatch(base);
    evconnlistener_free(evcon);
    event_base_free(base);
 
}
 
 
int main(int argc, char** argv)
{
    int serverfd;
    socklen_t serveraddrlen;
    struct sockaddr_in serveraddr;
    serveraddr.sin_family = AF_INET;    
    serveraddr.sin_port = htons(SERVERPORT);
    serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
    serverfd = socket(AF_INET, SOCK_STREAM, 0);
    serveraddrlen = sizeof(serveraddr);
    main_loop( &serveraddr);
 
    return 0;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

libevent设置超时后取消超时(bufferevent_set_timeouts取消超时无效问题) 的相关文章

  • Java实现终止线程池中正在运行的定时任务

    贴个广告 楼主的博客已全部搬迁至自己的博客 xff0c 感兴趣的小伙伴请移步haifeiWu与他朋友们的博客专栏 源于开发 最近项目中遇到了一个新的需求 xff0c 就是实现一个可以动态添加定时任务的功能 说到这里 xff0c 有人可能会说
  • TCP 粘包问题浅析及其解决方案

    最近一直在做中间件相关的东西 xff0c 所以接触到的各种协议比较多 xff0c 总的来说有TCP xff0c UDP xff0c HTTP等各种网络传输协议 xff0c 因此楼主想先从协议最基本的TCP粘包问题搞起 xff0c 把计算机网
  • Redis协议规范(译文)

    原文地址 xff1a haifeiWu的博客 博客地址 xff1a www hchstudio cn 欢迎转载 xff0c 转载请注明作者及出处 xff0c 谢谢 xff01 Redis客户端使用名为RESP xff08 Redis序列化协
  • Netty 源码中对 Redis 协议的实现

    原文地址 xff1a haifeiWu的博客 博客地址 xff1a www hchstudio cn 欢迎转载 xff0c 转载请注明作者及出处 xff0c 谢谢 xff01 近期一直在做网络协议相关的工作 xff0c 所以博客也就与之相关
  • 高性能无锁队列 Disruptor 初体验

    原文地址 xff1a haifeiWu和他朋友们的博客 博客地址 xff1a www hchstudio cn 欢迎转载 xff0c 转载请注明作者及出处 xff0c 谢谢 xff01 最近一直在研究队列的一些问题 xff0c 今天楼主要分
  • MYSQL快速导入大量数据 - LOAD DATA INFILE

    问题背景 xff1a 在做性能测试时 xff0c 通常需要根据业务模型在数据库中预置大量数据 我一开始的做法是使用python生成INSERT INTO语句的SQL脚本后 xff0c 再导入对应数据库 使用中会发现速度很慢 xff0c 10
  • Postman使用教程 - 导入请求(Import)

    Postman是一个有着图形化界面的API请求模拟平台 xff0c 在构造请求时最常见的莫过于手动在对应的输入框中填入相应的内容 xff1a 根据被测HTTP请求的Method URL Headers Request Params Body
  • Daily Cost 介绍

    Daily Cost是我为了学习前后端开发的产出成果 从应用名可以看出是一个记账本应用 xff0c 主要参考了鲨鱼记账 xff0c 我从中挑选了一部分核心功能来自己开发实现 1 功能模块 作为一个正经的记账本应用 xff0c 肯定要能满足用
  • zabbix5.4 如何配置报警一次

    如果小伙伴们在认真跟着大叔配置zabbix的话 xff0c 相信你现在已经至少配置好了自己的邮件报警了 可是你可能正在和我一样陷入到一个新的烦恼之中 xff0c 那就是zabbix 邮件轰炸机 xff08 呵呵 xff0c 暂时这么叫吧 x
  • Docker安装使用MySQL8

    1 下载image span class token function docker span pull mysql 也可以指定版本 xff1a docker pull mysql 5 7 xff0c 未指定时为latest 2 查看下载到
  • 使用colima替代docker-desktop

    本文使用操作系统为Mac OS 彻底和docker desktop说再见 brew uninstall docker cask cd rm rf docker 安装 brew update brew install docker colim
  • mfc 获取网卡名字

    void CGetSysInfo GetInterFaceName CString amp InterfaceName int pNum POSITION pos 61 Interfaces FindIndex pNum if pos 61
  • 关于.net连接数据获取数据失败的原因

    1 问题情景 报错提示 System InvalidCastException 类型的异常在 Oracle ManagedDataAccess dll 中发生 xff0c 但未在用户代码中进行处理 其他信息 指定的转换无效 sql语句执行正
  • 服务启动时报错:1053服务没有及时响应启动或控制请求

    问题 xff1a 替换dll文件后 xff0c 自定义服务启动时报错 xff1a 1053服务没有及时响应启动或控制请求 排查原因 xff1a 可能是程序启动缺少某些dll文件 解决方案 xff1a 1 使用depends依赖工具查看新增的
  • mysql4.0 新建用户报错ERROR 1064语法错误

    mysql4 0 新建用户执行 xff1a create user 39 test1 39 64 39 localhost 39 identified by 39 123456 39 报错ERROR 1064语法错误 百度查询报错无果 xf
  • mysql4报错:ERROR 1133: Can‘t find any matching row in the user table

    mysql4新建用户后修改密码报错 xff1a ERROR 1133 Can 39 t find any matching row in the user table 查看mysql user表中是否存在ttt0405 64 localho
  • ERROR 1 (HY000): Can‘t create/write to file ‘D:\data_3306\Temp\#sql590_1_2.MYI‘

    mysql在查询表结构 xff08 比如desc table1 xff09 xff0c 报错 xff1a ERROR 1 HY000 Can 39 t create write to file 39 D data 3306 Temp sql
  • 本地 IDEA 卡死了!我把它跑在 Linux 服务器上!

    引言 2021年底 xff0c JetBrains 推出了 Jetbrains Gateway 工具 xff0c 这是一款远程开发 Client 并且支持了 JetBrains 全家桶 xff0c 通过 Jetbrains Gateway
  • centos7中puppeteer的相关错误处理

    1 error while loading shared libraries libatk bridge 2 0 so 0 解决 xff1a yum install at spi2 atk y 2 error while loading s
  • zabbix 5.4 自定义模板

    如果你是使用zabbix的新手的话 xff0c 并不建议去自定义一套模板 xff0c 因为zabbix自带的模板就已经能够实现80 多的应用场景了 如果你对zabbix已经有了比较深刻的理解 xff0c 感觉系统自带的一些模板里有太多你用不

随机推荐

  • SpringBoot出现找不到或无法加载主类解决办法

    启动SpringBoot项目时 xff0c 出现了找不到或无法加载主类的提示 xff0c 解决的方法有两种情况 1 程序主入口的目录位置不正确 需要确定程序主入口的Application类是否和其余的文件在同一目录结构 如果不一致 xff0
  • Golang中interface类型转string类型

    Golang中interface类型转string类型 Strval 获取变量的字符串值 浮点型 3 0将会转换成字符串3 34 3 34 非数值或字符类型的变量将会被转换成JSON格式字符串 func Strval value inter
  • unsigned char与char 转换

    方法一 xff1a 不转换为char xff0c 转换为QString类型 xff1a span class hljs keyword unsigned span span class hljs keyword char span code
  • MariaDB 源码编译安装

    1 安装编译所需软件包 yum y install bison bison devel zlib devel libcurl devel libarchive devel boost devel gcc gcc c 43 43 cmake
  • 导入maven工程报错,Discover and map Eclipse plugins to Maven plugin goal executions.

    setup maven plugin connection discover and map eclipse plugins to maven plugin goal executions 问题 xff1a maven 缺包 解决 xff1
  • Notepad++ "TAB转为空格" 或者 “空格转TAB"

    今天提交代码 xff0c 老大review后 xff0c 要求将所有缩进 xff0c 默认的TAB改为 4个空格 xff0c 记录下操作步骤 xff1a 1 设置 按下图配置即可 设置 gt 34 首选项 gt 34 语言 gt 勾选 替换
  • java 实现布隆数

    package test import java util Arrays import java util BitSet import java util concurrent atomic AtomicInteger 64 author
  • influxdb 数据库安装和简单使用

    1 wget https dl influxdata com influxdb releases influxdb 1 8 4 x86 64 rpm 或者从 influxdb 1 8 4 x86 64 rpm 其它文档类资源 CSDN下载
  • 请求参数和应答数据统一加解密

    一 xff0c 针对请求参数和应答数据都是json格式时 xff0c 可以通过 xff0c 下面的方式 xff0c 进行统一的的加解密 1 设置配置文件 64 Bean public MappingJackson2HttpMessageCo
  • java 验证字符串是否为int,double 类型的数据

    import java util regex Matcher import java util regex Pattern 数据类型验证 64 author dell public class DataValidate 判断 String
  • zabbix 5.4 agent主动模式下`ZBX`图标显示灰色的处理

    通过前面的实际操作练习 xff0c 相信大家对zabbix已经有了比较深入的认识了 我们已经知道zabbix客户端分为 主动 和 被动 两种模式 xff0c 所谓主动模式就是客户端主动上报自身的监控数据 xff0c 而被动模式是服务端主动向
  • 解决mybatis 数据库date 与 java 中Date类型映射

    使用mybatis 从数据库中查询出date 类型字段 xff0c 在java 类型中只看到了日期 xff0c 没有看到时分秒 xff0c 从数据库中是可以看到时分秒的 后来发现是mybatis 映射数据类型的原因 xff1a 如 xff1
  • jwt 生成token 和解析token

    lt jjwt version gt 0 6 0 lt jjwt version gt lt fastjson version gt 1 2 16 lt fastjson version gt lt dependency gt lt gro
  • Linux下使用grep,tail 查看查找日志

    有时候日志文件比较大 xff0c 有几G 无法使用工具打开文件 xff0c 这个时候就需要使用命令来查找错误信息 一 tail 命令 例如查看 catalina out 后50行日志 color 61 darkred tail 50f ca
  • 解决redisCluster 连接失败的问题

    使用redis3 2 8 建立集群后 xff0c 发现在连接redis 经常报连接失败 但是单独连接某个节点时 xff0c 是不会报错的 xff0c 经过分析终于发现了原因 原因是这样的 xff1a 我在建立集群的时候配置文件redis c
  • Thymeleaf select 使用 和多select 级联选择

    1 使用select 并且回绑数据 页面 xff1a 状态 xff1a lt select name 61 34 status 34 th field 61 34 status 34 id 61 34 idstatus 34 class 6
  • 防止 XML外部实体注入

    方式一 DocumentBuilderFactory dbf 61 DocumentBuilderFactory newInstance 这是优先选择 如果不允许DTDs doctypes 几乎可以阻止所有的XML实体攻击 String F
  • maven搭建mybatis实现增删改查

    第一章框架的概述 1三层结构 mvc web开发 使用mvc架构模式 m 数据 v 视图 c 控制器 c控制器 xff1a 接收请求 调用service对象 显示请求的处理信息 当前的servlet作为控制器 v 视图现在使用jsp htm
  • html5图片垂直居中

    html5图片居中 主要的思路是用table或者table cell xff0c 还有一种不太了解 xff0c 贴在最后 一 xff1a 显式使用table标签 这是只需要定义内容的CSS样式为table cell的 xff0c 并垂直居中
  • libevent设置超时后取消超时(bufferevent_set_timeouts取消超时无效问题)

    libevent用 bufferevent set timeouts 函数来设置读和写的超时时间timeout xff0c 比如设置读超时时间 xff0c 如果接收超时就会调用设置的错误处理函数 以tcp服务器为例 xff0c 在accep