我正在玩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
的重点是什么?是在你完成一次写作以及关闭你发送“东西”的连接的时候?
答案 0 :(得分:0)
writecb
的点与readcb
相反:当bufferevent的OUTPUT端有足够的空间来写入一些新数据时,libec会自动调用writecb。
在这里,您描述了无限循环的一个很好的例子:
writecb由libevent调用(因为OUTPUT侧有足够的空间)
在writecb中生成新数据并通过bufferevent_write_buffer
将其写入OUTPUT。然后writecb将上下文返回到libevent主循环。
libevent将所有数据从OUTPUT传递到内核。完成后,libevent会看到OUTPUT缓冲区中有一个空闲位置可用。这将生成下一个writecb
事件,并再次调用回调...这是无限循环。