利用bufferevent_socket_connect()建立网络连接

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, 0sizeof(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;
}
posted @ 2014-04-07 15:23  孤火  阅读(7219)  评论(4编辑  收藏  举报