【问题标题】:Libevent 2 - write callback / infinite loopLibevent 2 - 编写回调/无限循环
【发布时间】:2015-07-12 21:51:39
【问题描述】:

我正在使用 Libevent 作为服务器,但遇到了问题

基本上我使用的是本页底部的示例,http://www.wangafu.net/~nickm/libevent-book/Ref6_bufferevent.html: 我的 main/accept/readcb 运行良好 - 但是试图理解 writecb

在我走得更远之前,我想确保我有这个正确的。

当客户端发送 (curl in this instance) 发送一些JSON 时,这在read_callback 中调用,当我想回信到curl 时,我使用write_callback

简而言之,当我使用json 进行卷曲时,我遇到的问题。它请求服务器在发送JSON 之前发送http/1.1 100 continue。我可以忽略这一点,但宁愿不这样做。

这就是我的写回调:

void writecb(struct bufferevent *bev, void *ctx){
   struct evbuffer *tmp = evbuffer_new();
   evbuffer_add_printf(tmp, "HTTP/1.1 100 Continue\r\n\r\n");
   bufferevent_write_buffer(bev, tmp);
   evbuffer_free(tmp);
   printf("finish sending data back to client!\n");
}

当我执行curl 声明时会发生什么:

curl -vv -H "Content-Type: application/json" --data @test.json http://localhost:40714

在控制台上有一个无限循环。

但是,如果我将此代码放在readcb 中,它就像一个魅力。所以我的问题是,writecb 有什么意义?是在您完成写入以及关闭您发送“东西”的连接时吗?

【问题讨论】:

    标签: libevent


    【解决方案1】:

    writecb的点与readcb相反:当bufferevent的OUTPUT端有足够的空间可以写入一些新数据时,libevent会自动调用writecb。

    您在这里描述了一个很好的无限循环示例:

    • libevent调用writecb(因为OUTPUT端有足够的空间)

    • 在 writecb 中,您生成新数据并通过 bufferevent_write_buffer 将其写入 OUTPUT。然后 writecb 将上下文返回给 libevent 主循环。

    • libevent 正在将所有数据从 OUTPUT 传递到内核。完成后,libevent 会看到 OUTPUT 缓冲区中有一个可用空间。这会生成下一个writecb 事件并再次调用回调...这里是无限循环。

    【讨论】:

      猜你喜欢
      • 2016-11-01
      • 2011-09-21
      • 1970-01-01
      • 1970-01-01
      • 2011-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多