Cesanta Mongoose - 连接到本地主机时出现问题

Cesanta Mongoose - problems when connecting to localhost

本文关键字:主机 问题 Mongoose 连接 Cesanta      更新时间:2023-10-16

我在使用 Cesanta Mongoose Web 服务器库构建 HTTP 服务器时遇到问题。当我构建了一个 HTTP 服务器来侦听端口 8080 并且客户端向 localhost:8080 发送 HTTP 请求时,我遇到了问题。问题是服务器处理请求很好并发回响应,但客户端仅在我杀死服务器进程后处理和打印响应。基本上,Mongoose 的工作原理是创建采用事件处理程序函数 ev_handler(( 的连接。每当 发生"事件",例如收到请求或回复。在服务器端,事件处理程序函数在收到来自 8080 上的客户端的请求时被调用 fine。但是,客户端事件处理程序函数在响应发送回复时不调用,而仅在服务器进程被终止后调用。我怀疑这可能与连接在本地主机上的事实有关,我是对的 - 当客户端向本地主机以外的地址发送请求时,不会发生此问题。事件处理程序函数称为 fine。以下是客户端的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;
};
}

尝试在本地主机上与同一台计算机上的服务器建立连接时,这是一个常见问题吗?

这种行为的原因是客户端连接在读取所有数据之前不会触发事件。客户端如何知道所有数据都被读取?有3种可能性:

  1. 服务器已发送Content-Length: XXX标头,客户端已读取邮件正文的 XXX 字节,因此它知道它收到了所有内容。
  2. 服务器已发送Transfer-Encoding: chunked标头,并发送了所有数据块,后跟一个空块。当客户端收到空块时,它知道它收到了所有内容。
  3. 服务器既不设置Content-Lenth,也不设置Transfer-Encoding。在这种情况下,客户端不知道正文的大小,并且它会一直读取,直到服务器关闭连接。

你看到的是(3(。解决方案:在服务器代码中设置Content-Length