1

次のサンプル プログラムでは、次のようになります。

#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 では、最初の assert は期待どおりにパスしますが、2 番目の assert は失敗します。つまり、evhttp_request_get_connection(req) は NULL を返します。何故ですか?

evhttp_request_get_connection クレームのドキュメント:

リクエストに関連付けられた接続オブジェクトまたは NULL を返します。

しかし、私はまだ接続を持っています。どこにも捨てません。

私は何か間違ったことをしていますか、それともバグですか、それとも単にあいまいな機能ですか?

4

1 に答える 1

0

接続はすでに解放されている (クローズされているか、HTTP キープアライブが有効になっている場合は再利用のために開いたままになっている) ため、応答コールバックで接続へのポインターを取得することはできません。

evhttp_connection_done() (http.c、780 行目から 817 行目あたり) で、要求の接続フィールド (evcon) が NULL に設定された後に応答コールバックが呼び出されることがわかります。ただし、evhttp API があまり明確ではないことに同意します。

于 2013-07-22T12:26:58.310 に答える