libevent多线程http服务器:无法在子线程中成功回复evhttp_request

时间:2018-09-11 04:06:38

标签: libevent

问题是:客户端无法在服务器端的子线程中接收到带有“ evhttp_send_reply”的http响应。

我已经尝试过使用libevent evhttp设置模型的多线程http服务器,以下代码在主线程中运行:

    struct event_base *mpEventBase = event_base_new();
    struct evhttp *pHttp = evhttp_new(mpEventBase);
    evhttp_bind_socket(pHttp, "0.0.0.0", port);
    evhttp_set_gencb(pHttp, HttpGenericCallback, (void *)this);
    event_base_dispatch(mpEventBase);

然后将设置http服务器,并开始接受来自客户端的连接。 但是对于处理长时间运行的代码的一般情况,我将所有http请求转发到子线程并在子线程中发送http响应。

    void HttpGenericCallback(struct evhttp_request *pRequest, void* arg) {
        Class *thiz = (Class *)arg;
        // run in sub thread in thread pool
        thiz->mpThreadPool->Run([thiz](struct evhttp_request *pReq){
            struct evbuffer* pEvbuf = evbuffer_new();
            if (!pEvbuf) {
                std::cout << "create evbuffer failed!\n";
                return ;
            }

            const char *pUrl = evhttp_request_get_uri(pRequest);
            evbuffer_add_printf(pEvbuf, "Server response. Your request url is %s", pUrl);
            evhttp_send_reply(pRequest, HTTP_OK, "OK", pEvbuf);
            evbuffer_free(pEvbuf);
        }, pRequest);
    }

但是,我在“ evhttp_send_reply”之后发现,客户端DID未收到任何响应。我不确定哪一步错了? 此外,如果我将在子线程中运行的代码移动到HttpGenericCallback,它将可以正常工作!

任何建议都将不胜感激!

1 个答案:

答案 0 :(得分:0)

您的HttpGenericCallback被调用,并且您正在将struct evhttp_request*传递给线程。 HttpGenericCallback完成并可能破坏您的struct evhttp_request*,而您的线程继续使用已经无效的指针工作。