【问题标题】:Cesanta Mongoose - problems when connecting to localhostCesanta Mongoose - 连接到本地主机时出现问题
【发布时间】:2019-12-02 20:26:15
【问题描述】:

我在使用 Cesanta Mongoose Web 服务器库构建 HTTP 服务器时遇到问题。当我有一个构建用于侦听端口 8080 的 HTTP 服务器以及一个向 localhost:8080 发送 HTTP 请求的客户端时,就会出现我遇到的问题。问题是服务器很好地处理了请求并发回了响应,但客户端仅在我终止服务器进程后处理并打印响应。基本上,Mongoose 可以在您创建连接时使用 事件处理程序 函数 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;
  };
  }

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

【问题讨论】:

  • 当您尝试其他客户端(例如普通浏览器)时会发生什么?

标签: c++ http https network-programming mongoose-web-server


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-01
    • 2020-01-20
    • 2016-11-15
    • 2022-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多