Libevent 2 - 写回调/无限循环

时间:2015-07-12 21:51:39

标签: libevent

我正在玩Libevent作为服务器而我遇到了问题

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

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

当客户端发送(curl in this instance)发送一些JSON时,这会在read_callback中调用,当我想回写curl时我会使用{ {1}}。

当我用write_callback卷曲时,我的问题很简单。它要求服务器在发送json之前发送http / 1.1 100。我可以忽略它但不愿意。

所以这就是我写回调的内容:

JSON

当我做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的重点是什么?是在你完成一次写作以及关闭你发送“东西”的连接的时候?

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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