这两天在学习libevent,因为之前并没有这方面经验,学习起来很吃力,照着写了几个demo运行的结果和想象中都不一样,先贴一下代码
void event_cb(struct bufferevent *bev, short events, void *ptr) {
if (events & BEV_EVENT_CONNECTED) {
printf("cb for BEV_EVENT_CONNECTED\n");
char buf[] = "I want to write a very long long long long long long long long long sentence.";
bufferevent_write(bev, buf, sizeof(buf));
} else if (events & BEV_EVENT_ERROR) {
perror("connect");
} else if (events & BEV_EVENT_EOF) {
printf("EOF\n");
event_base_loopbreak((struct event_base *) ptr);
}
}
void write_cb(struct bufferevent *bev, void *arg) {
printf("ready to write\n");
}
void read_cb(struct bufferevent *bev, void *arg) {
printf("ready to read\n");
char buf[1024];
memset(buf, 0, sizeof(buf));
ssize_t n;
while ( (n = bufferevent_read(bev, buf, sizeof(buf)) > 0)) {
printf("%s, %zd", buf, n);
}
}
int main_loop(void) {
struct event_base *base;
struct bufferevent *bev;
struct sockaddr_in sin;
base = event_base_new();
memset(&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = htonl(0x7f000001);
sin.sin_port = htons(5555);
bev = bufferevent_socket_new(base, -1, BEV_OPT_CLOSE_ON_FREE);
bufferevent_setcb(bev, read_cb, write_cb, event_cb, (void *) base);
bufferevent_enable(bev ,EV_WRITE | EV_READ);
struct timeval s= {1, 0};
bufferevent_set_timeouts(bev, /*&s*/ NULL, &s);
if (bufferevent_socket_connect(bev, (struct sockaddr *) &sin, sizeof(sin)) < 0) {
bufferevent_free(bev);
return -1;
}
event_base_dispatch(base);
printf("after dispatch\n");
return 0;
}
int main() {
main_loop();
}
本机的5555是一个echo服务,我有几点不明白的地方,希望高手可以帮忙解答一下
我现在只想到了在connect的时候写入数据(因为不同于event,bev的write_callback是只有在output bevbuffer中的数据超过写入低水位后,才被调用,而这个时候output buffer中已经有数据了啊),求问这种是正确的做法吗?我感觉不应该这么做啊,另外,我为什么没觉得在write_callback的时候可以做什么事情啊
我这个程序跑起来后,会被吊起,输出如下,要过好一会,才会读到数据返回,我觉得应该是我的代码有问题,要不然本机通讯怎么能吊起那么久呢?因为我不会鼓捣mac上的gdb,也看不到到底卡在哪里。希望可以指点一下,如果方便的话提供下学习资料的地址是最好的啦!谢谢!
cb for BEV_EVENT_CONNECTED
ready to write
ready to read
PS:补充下最后的输出,还是有地方不理解:
I want to write a very long long long long long long long long long sentence., 1
后来想到了可能是因为READ的水位太低,每次读一个字节,所以慢,水位设置为10以后,输出速度快了很多,但是为什么最后的n还是1呢?这个字符串的长度是77,另外我发现我把低水位如果设置的大于了77(比如开始我设置的是128), 是一直不会调用我的read_cb的,这个不科学吧???是我使用的姿势不争取吗