libevent中bufferevent的使用

这两天在学习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服务,我有几点不明白的地方,希望高手可以帮忙解答一下

  1. 我现在只想到了在connect的时候写入数据(因为不同于event,bev的write_callback是只有在output bevbuffer中的数据超过写入低水位后,才被调用,而这个时候output buffer中已经有数据了啊),求问这种是正确的做法吗?我感觉不应该这么做啊,另外,我为什么没觉得在write_callback的时候可以做什么事情啊

  2. 我这个程序跑起来后,会被吊起,输出如下,要过好一会,才会读到数据返回,我觉得应该是我的代码有问题,要不然本机通讯怎么能吊起那么久呢?因为我不会鼓捣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的,这个不科学吧???是我使用的姿势不争取吗

阅读 5.6k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题