2015-07-12 31 views
0

我玩LIBEVENT作为服务器,我有一个问题LIBEVENT 2 - 写回调/无限循环

基本上我使用在本页面底部的例子,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继续。我可以忽略它,但宁可不。

所以这是我为我写的回调:

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有什么意义?是在什么时候完成一个写作,以及如何关闭你发送'东西'的连接?

回答

0

writecbreadcb相反:当bufferevent的OUTPUT端有足够的空间写入某些新数据时,libec自动调用writecb。

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

  • writecb被libevent的引用(因为有足够的空间在输出侧)

  • 内writecb您生成新的数据和写它通过bufferevent_write_buffer进入OUTPUT。然后writecb将上下文返回给libevent主循环。

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