虽然 libevent HTTP 服务器可以给连接注册关闭回调, 但客户端强制断开连接时, 服务器并没有立即知道.
evhttp_connection_set_closecb(req->evcon, on_close, NULL);
原来, libevent 在收到 HTTP 请求后, 就不再监听读事件了, 所以就不能通过 read() 返回 0 来知道连接断开, 只能通过 send() 导致 SIGPIPE 才能知道.
为了让服务器立即知道客户端的断开, 只需要重新监听 EV_READ 事件即可.
struct bufferevent *bev = evhttp_connection_get_bufferevent(req->evcon); bufferevent_enable(bev, EV_READ);