2013-07-22 119 views
0

在下面的示例程序:爲什麼evhttp_request_get_connection()總是返回NULL?

#include <event2/event.h> 
#include <event2/http.h> 
#include <assert.h> 

void response_cb(struct evhttp_request* req, void *arg) { 
    assert(evhttp_request_get_response_code(req)<400);/* passes */ 
    assert(evhttp_request_get_connection(req));/* FAILS ??? */ 
} 

int main(int argc, char **argv) { 
    struct event_base* ev_base; 
    struct evhttp_connection *http_conn; 
    struct evhttp_request *req; 

    ev_base = event_base_new(); 
    http_conn = evhttp_connection_base_new(ev_base, NULL, "google.com", 80); 
    req = evhttp_request_new(response_cb, NULL); 

    evhttp_make_request(http_conn, req, EVHTTP_REQ_GET, "/"); 

    event_base_dispatch(ev_base); 
    return -1; 
} 

在response_cb第一斷言通過,如預期的,但秒失敗即evhttp_request_get_connection(REQ)返回NULL。這是爲什麼?

爲evhttp_request_get_connection權利要求中的文檔:

返回與請求或NULL相關聯的連接對象。

但我仍然有一個連接。我不會在任何地方處理它。

我做錯了什麼,或者這是一個錯誤還是隻是一些模糊的功能?

回答

0

由於連接已經被釋放(關閉,或者如果啓用HTTP Keepalive時保持打開狀態以便重用),您無法獲得指向響應回調中連接的指針。

您可以在evhttp_connection_done()(http.c,大約第780至817行)中看到在請求的連接字段(evcon)設置爲NULL後調用響應回調。但我同意evhttp API不是很清楚。

+0

保持活力似乎與此問題沒有任何關係。 根據http.c:evhttp_connection_done()req-> evcon = NULL爲所有傳出連接設置,不僅用於非保持連接。 –

+0

那麼,這只是一個例子,並非徹底檢查連接可能被重用的所有情況。對不起,如果這似乎。 –

相關問題