首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >塞桑塔猫鼬-连接本地主机时出现的问题

塞桑塔猫鼬-连接本地主机时出现的问题
EN

Stack Overflow用户
提问于 2019-12-02 20:26:15
回答 1查看 304关注 0票数 1

我在使用Cesanta服务器库构建HTTP服务器时遇到了问题。当我在端口8080上构建了一个HTTP服务器,并且客户端向localhost发送一个HTTP请求:8080时,就会出现这个问题。问题是服务器很好地处理请求并发回响应,但是客户端只在我杀死服务器进程之后处理和打印响应。基本上,Mongoose的工作原理是创建使用事件处理程序函数ev_handler()的连接。每当发生“事件”(例如接收请求或答复)时,都会调用此事件处理程序函数。在服务器端,事件处理程序函数在8080从客户端接收请求时被调用。但是,当响应发送应答时,客户端事件处理程序函数不会被调用,而只有在服务器进程被终止后才会调用。我怀疑这可能与连接在本地主机上这一事实有关,而且我是对的--当客户端向本地主机以外的地址发送请求时,不会发生此问题。事件处理程序函数称为精细。下面是客户端上的ev_handler函数以供参考:

代码语言:javascript
复制
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;
  };
  }

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

EN

回答 1

Stack Overflow用户

发布于 2021-01-29 13:51:23

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

everything.

  • Server服务器已经发送了Content-Length: XXX头,客户端读取了消息正文的XXX字节,因此它知道接收到的发送了Transfer-Encoding: chunked头,并发送了所有数据块,后面是一个空块。当客户端接收到一个空块时,它知道它收到的everything.
  1. Server集既不是Content-Lenth,也不是Transfer-Encoding。在这种情况下,客户端不知道主体的大小,它一直在读取,直到服务器关闭连接。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59146180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档