我在使用Cesanta Mongoose Web服务器库构建HTTP服务器时遇到问题。当我有一个构建为侦听端口8080的HTTP服务器以及一个向localhost:8080发送HTTP请求的客户端时,就会出现我遇到的问题。问题在于服务器可以很好地处理请求并发送回响应,但是客户端在我杀死服务器进程后仅处理并打印响应 。基本上,Mongoose的工作原理是创建带有 event handler 函数ev_handler()的连接。每当 发生“事件”,例如接收请求或答复。在服务器端,当事件处理程序函数在8080上收到来自客户端的请求时,将调用罚款事件处理函数。但是,响应发送答复时,不会调用客户端事件处理函数,而仅在服务器进程之后才调用被杀死。我怀疑这可能与连接位于localhost上有关,而我是对的-当客户端将请求发送到除localhost以外的地址时,不会发生此问题。事件处理函数称为罚款。这是客户端上的ev_handler函数供参考:
static void ev_handler(struct mg_connection *c, int ev, void *p) {
if (ev == MG_EV_HTTP_REPLY) {
struct http_message *hm = (struct http_message *)p;
c->flags |= MG_F_CLOSE_IMMEDIATELY;
fwrite(hm->message.p, 1, (int)hm->message.len, stdout);
putchar('\n');
exit_flag = 1;
} else if (ev == MG_EV_CLOSE) {
exit_flag = 1;
};
}
尝试在本地主机上与同一台计算机上的服务器建立连接时,这是一个常见问题吗?
答案 0 :(得分:0)
这种行为的原因是客户端连接在读取所有数据之前不会触发事件。客户端如何知道读取了所有数据?有3种可能:
Content-Length: XXX
标头,客户端已读取消息正文的 XXX 个字节,因此它知道它收到了所有内容。Transfer-Encoding: chunked
标头,并发送所有数据块后跟一个空块。当客户端收到一个空块时,它知道它收到了所有内容。Content-Lenth
,也未设置 Transfer-Encoding
。在这种情况下,客户端不知道正文的大小,它会一直读取直到服务器关闭连接。你看到的是(3)。解决方案:在您的服务器代码中设置 Content-Length
。