利用bufferevent_socket_connect()建立网络连接

本文通过一个实验案例深入探讨了libevent中的bufferevent组件的触发机制,特别是其是否采用边沿触发还是程度触发的方式。通过对客户端和服务端通信过程的具体实现与分析,揭示了bufferevent的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

libevent为我们供给了一个很便利的组件bufferevent,可以将底层的通信接口抽象为缓存操纵,可以使我们无须本身再直接处理惩罚 套接口的发送和接管,并在其上供给读、写、事务回调,具体的文档可参考([翻译]libevent参考手册第六章:bufferevent:概念和入门) 是一份官方文档的翻译,然则该文章中没有说清楚bufferevent的触发前提,仅说了凹凸水位触发等景象,我想知道的是bufferevent是程度 触发还是边沿出发的,比如说读事务已触发然则我发明缓冲中没有足够的数据,不读空缓冲中的数据,则下次再次触发读事务是在什么时辰?是类似程度触发,只要 读缓冲区中稀有据就不绝的触发还是鄙人次稀有据参加读缓冲区时触发?

  故只有写代码本身去验证。客户端采取bufferevent连接办事端,注册读和错误事务回调,办事端从终端上每次读取一行数据发往客户端,客户端触发读事务回调后并不读空读缓存,以此查看bufferevent的回调是程度触发还是边沿触发的。

 

客户端代码client.c


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>

#include <event2/event.h>
#include <event2/bufferevent.h>
#include <event2/buffer.h>

#define SVRADDR "127.0.0.1"
#define PORT 7890

staticvoid buff_input_cb(struct bufferevent *bev, void*ctx) {

printf("***in %s\n", __func__);

printf("len=%d\n", evbuffer_get_length(bufferevent_get_input(bev)));

return;
}

staticvoid buff_ev_cb(struct bufferevent *bev, short events, void*ctx) {

printf("in %s\n", __func__);

if (events & BEV_EVENT_CONNECTED) {
printf("***BEV_EVENT_CONNECTED\n");
} elseif (events & BEV_EVENT_ERROR) {
printf("***BEV_EVENT_ERROR\n");
}
return;
}


int main() {

int sockfd;
struct event_base *p_base;
struct bufferevent *p_event;

struct sockaddr_in addr;;

memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);

if (inet_pton(AF_INET, SVRADDR, &addr.sin_addr) <=0) {
printf("inet_pton");
exit(1);
}

if ((p_base = event_base_new()) == NULL) {
printf("event_base_new ");
return1;
}

if ((p_event = bufferevent_socket_new(p_base, -1, BEV_OPT_CLOSE_ON_FREE)) == NULL) {
printf("bufferevent_socket_new ");
return1;
}

if ((sockfd = bufferevent_socket_connect(p_event, (struct sockaddr *)&addr, sizeof(addr))) <0) {
printf("bufferevent_socket_connect ");
return1;
}

bufferevent_setcb(p_event, buff_input_cb, NULL, buff_ev_cb, p_base);
bufferevent_enable(p_event, EV_READ);

event_base_dispatch(p_base);

return0;
}

转载于:https://www.cnblogs.com/lchb/articles/3650195.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值