2015-07-12 158 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事件,並且回調會再次被調用...並且這裏是無限循環。