【发布时间】: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 问题已更新。