【问题标题】:node.js http couldn't receive request from C++ clients via socketnode.js http 无法通过套接字接收来自 C++ 客户端的请求
【发布时间】:2018-07-13 09:25:57
【问题描述】:

我正在尝试从 C++ 客户端向 nodejs 服务器发送 GET 请求。

nodejs 服务器:

const server = http.createServer((request, response) => {
    console.log(request.url);
    response.end("received");
})

这是我的 C++ 客户端:

while(getline(cin, random_input)) {
    int s_len;
    input = "GET / HTTP/1.1\r\n\r\n";
    s_len = send(sock, input.c_str(), input.size(), 0);

    if( s_len < 0)
    {
        perror("Send failed : ");
        return false;
    }
    cout<<socket_c.receive(1024);
}

string tcp_client::receive(int size=512)
{
    char buffer[size];
    string reply;
    int r_len; // received len

    //Receive a reply from the server
    r_len = recv(sock, buffer, sizeof(buffer), 0);
    if( r_len < 0)
    {
        puts("recv failed");
    }

    if(buffer[r_len-1] == '\n') {
        buffer[r_len-1] = '\0';
    } else {
        buffer[r_len] = '\0';
    }
    reply = buffer;
    return reply;
}

所以 C++ 客户端每次在终端中输入内容时都可以发送 GET 请求。

如果我在建立连接后立即输入内容,它会很好地工作。但是,如果我在建立连接后等待 15-30 秒,然后在客户端程序上输入一些内容,虽然发送的字节数 s_len 是正确的,但服务器无法接收任何内容。

我可以知道出了什么问题吗?

【问题讨论】:

  • 在发送之前打印出您的data 中的内容。它是否包含有效的 HTTP 请求?
  • 为什么是strlen( data.c_str() )?为什么不只是data.size()?另外,data是什么?和command有关系吗?和普通的send 对比socket_c.receive,那里发生了什么?你的GET 请求在哪里?您在哪里检查 C++ 代码中对等方正在关闭的连接?在您显示的代码中并不奇怪。请尝试创建Minimal, Complete, and Verifiable Example 向我们展示。
  • @Mateusz 它确实包含一个有效的 HTTP 请求。
  • @Someprogrammerdude 问题已更新。

标签: c++ node.js sockets


【解决方案1】:

我发现了一些错误:

  1. send 返回值检查不正确。条件input.size() == s_len 必须为真。
  2. recv 返回值未检查 EOF。它将r_len0 视为有效数据而不是断开连接。这可能是您看不到服务器回复的原因:它可能已断开连接,但您没有注意到。

【讨论】:

    【解决方案2】:

    将node.js服务器的keepAliveTimeout的值设置为0可以解决问题

    【讨论】:

      猜你喜欢
      • 2012-10-27
      • 1970-01-01
      • 2012-01-31
      • 2013-03-07
      • 2020-07-18
      • 2014-02-03
      • 1970-01-01
      • 2011-08-26
      • 1970-01-01
      相关资源
      最近更新 更多