我在使用Cesanta服务器库构建HTTP服务器时遇到了问题。当我在端口8080上构建了一个HTTP服务器,并且客户端向localhost发送一个HTTP请求:8080时,就会出现这个问题。问题是服务器很好地处理请求并发回响应,但是客户端只在我杀死服务器进程之后处理和打印响应。基本上,Mongoose的工作原理是创建使用事件处理程序函数ev_handler()的连接。每当发生“事件”(例如接收请求或答复)时,都会调用此事件处理程序函数。在服务器端,事件处理程序函数在8080从客户端接收请求时被调用。但是,当响应发送应答时,客户端事件处理程序函数不会被调用,而只有在服务器进程被终止后才会调用。我怀疑这可能与连接在本地主机上这一事实有关,而且我是对的--当客户端向本地主机以外的地址发送请求时,不会发生此问题。事件处理程序函数称为精细。下面是客户端上的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;
};
}当试图在本地主机上与同一台计算机上的服务器建立连接时,这是一个常见问题吗?
发布于 2021-01-29 13:51:23
造成这种行为的原因是,在读取所有数据之前,客户端连接不会触发事件。客户端是如何知道所有数据被读取的?有三种可能性:
everything.
Content-Length: XXX头,客户端读取了消息正文的XXX字节,因此它知道接收到的发送了Transfer-Encoding: chunked头,并发送了所有数据块,后面是一个空块。当客户端接收到一个空块时,它知道它收到的everything.Content-Lenth,也不是Transfer-Encoding。在这种情况下,客户端不知道主体的大小,它一直在读取,直到服务器关闭连接。你看到的是(3)。解决方案:在服务器代码中设置Content-Length。
https://stackoverflow.com/questions/59146180
复制相似问题