我编写了一个简单的 Web 服务器来处理长轮询,这意味着服务器不会向客户端(Web 浏览器、curl 等)发送完整的 HTTP 响应,而只会发送 HTTP 标头并挂起连接。
我使用命令行 curl 向服务器发出请求,它很好地打印出 HTTP 响应标头,并且 curl 按预期挂起。然后我按 CTRL+C 终止 curl 过程。但是服务器永远不会知道这个关闭(永远不会调用on_disconnect())。
一些代码:
void request_handler(struct evhttp_request *req, void *arg){
// only send response headers, and one piece of chunked data
evhttp_send_reply_start(req, HTTP_OK, "OK");
evbuffer_add_printf(buf, "...\n");
evhttp_send_reply_chunk(req, buf);
// register connection close callback
evhttp_connection_set_closecb(req->evcon, on_disconnect, sub);
}
void on_disconnect(struct evhttp_connection *evcon, void *arg){
printf("disconnected\n");
}
evhttp_set_gencb(http, request_handler, NULL);
我的问题是,如何检测这种客户端关闭(收到 TCP FIN)?
github上的错误