linux套接字cpp-recv()-无法通过http完全记录数据
linux sockets cpp recv() - cant recv fully data via http
我正在制作这个套接字HTTP客户端(非常基础(。当recv((从example.com中读取响应数据时,它运行良好,并将其全部写入缓冲区,但当我尝试重新生成任何更大的数据量时,它会停止在1500字节左右。
现在我所要做的就是将响应写入缓冲区(头等等(。没有试图解析任何内容。但这不起作用。它可以进行几次迭代,但随后会停止或挂起。我请求帮助识别导致这些行为的receive_response((函数的问题。
这是revc的HTTP响应的函数:
void tcp_client::receive_response(char *buffer) {
int bytes_recv = 0;
int total_bytes_recv = 0;
for (;;) {
bytes_recv = recv(sock, &buffer[total_bytes_recv], CHUNK_SIZE, 0);
if (bytes_recv <= 0) {
break;
} else {
total_bytes_recv += bytes_recv;
}
}
}
主要功能:
int main(int argc, char **argv) {
http_client http;
char response[100000] = {0};
http.connect_to_host("go.com", 80);
http.send_request("GET / HTTP/1.1rnrn");
http.receive_response(response);
std::cout << response << std::endl;
return 0;
}
谢谢
您似乎希望服务器在传输响应后关闭连接。默认情况下,典型的HTTP 1.1
服务器不会执行此操作;除非客户端通过Connection: close
报头明确提出其他请求,否则它们将保持连接打开以供进一步请求。
因此,您收到了所有的数据,然后下一个recv
呼叫就在那里,等待更多的数据到达。
HTTP 1.1
客户端期望通过Content-Length
报头或通过解码chunked
响应来检测响应的结束,如Transfer-Encoding: chunked
报头所指示的。
相关文章:
- 防止主数据类型C++的隐式转换
- 用于访问容器<T>数据成员的正确 API
- 在 C++/C 中使用 CURL 发出带有数据文件的 GET HTTP 请求
- 如何在C++中使用带有SFML的http reqest从节点.js服务器获取数据?
- 在 MySQL 中运行 HTTP 服务器以从客户端接收数据
- C++:如何通过 curl 调用使用 HTTP post 请求发送二进制数据(protobuf 数据)
- 使用 HTTP 方法 POST 或 PUT 上传数据
- 如何在 c++ 中在 http/https 端口上发送和接收数据?
- 如何从 HTTP 响应中删除垃圾数据
- 通过HTTP请求从站点检索数据(使用QT5.4的C++)
- 在浏览器中呈现数据之前,是否可以拦截http请求并修改数据(例如使用regex替换内容)?如果是,如何
- 响应标头和非HTTP数据的HTTP分离
- 接收recv数据,直到流结束(使用HTTP)
- http 请求在 & 符号后剪切数据 &
- (Qt或其他)拖放数据的mime类型的uri-list与协议http或ftp在Windows桌面或explorer.ex
- 使用libevent读取连续的HTTP流并在随机时间发送数据
- Libcurl HTTP post发送数据到服务器
- 使用Winsock接收分块HTTP数据
- Http post - 发送大数据 vc++ 时连接重置
- Boost ptime:如何以浏览器在http请求的header内发送的方式格式化数据