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

时间:2019-12-02 20:26:15

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

我在使用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;
  };
  }

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

1 个答案:

答案 0 :(得分:0)

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

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

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