接收recv数据,直到流结束(使用HTTP)
Receive recv data until end of stream (using HTTP)?
这是我第一次尝试使用c++套接字,我遇到了第一个障碍。我使用send
函数(GET / HTTP/1.1rnrn
)向谷歌发送了一些数据,现在我正试图收到响应。我当前的代码:
char buffer[256];
std::string result = "";
int resultSize = 0;
bool receive = true;
while (receive) {
resultSize = recv(dataSocket, buffer, sizeof(buffer) - 1, 0);
buffer[resultSize] = ' '; // Add NULL terminating character to complete string
result += buffer;
for (int i = 0; i < resultSize; i++) {
if (buffer[i] == ' ') {
receive = false;
}
}
}
return result;
使用256大小的缓冲区来演示这个问题,即如果页面包含的字节比我在缓冲区中接收的字节多,那么第一次尝试时它不会接收到所有内容。我试过循环,直到数据包含一个空终止符(' '
),这似乎不起作用。我也试着检查空行('rn'
),这并不奏效,因为有一个页的标题和HTML内容之间的空行。
我注意到的是,我可以使用Content-Length头来解决这个问题。然而,我不确定如何获得该标题,因为它需要至少一个接收调用,如果有一个好的,安全和有效的方法来做到这一点。当响应不包括Content-Length头时,我也不确定该怎么办,因为程序将陷入无限循环。
因此,如果有一种方法允许我重复recv,直到到达HTTP流的末尾,我想知道它。
如果有人能帮我,我会很感激的!
正确的行为是当HTTP响应数据告诉您停止阅读时停止阅读。首先读取响应报头(读取到rnrn
为止),然后解析报头,然后按照报头的指示读取响应体的其余部分,只有在到达报头所指示的响应结束时或服务器关闭连接时(以先遇到的情况为准)才停止读取。-人头马·勒博
相关文章:
- 如何使用 SFML 在贪吃蛇游戏中定义游戏结束?
- 在函数结束后使用指向变量的指针是否安全?
- 结束另一个线程中使用的对象的生存期
- 使用 shared_ptr 在中断时结束多线程循环
- 如何使用循环结束 c++ 上的行
- 为什么在使用不相关的宏时会阻止 while 循环结束?
- C++未使用的变量警告,即使我在函数结束时返回它
- 如何使用Chrono或ctime libaray输入设置的开始和结束时间
- 在新作用域中使用unique_lock是否等效于在使用共享资源的工作结束时解锁调用
- 如何使用 AWS C++ 开发工具包在给定的开始和结束日期范围内列出 S3 中的文件
- 我们可以在第一个else-if条件结束后使用另一个else-if条件吗
- 使用分隔符结束用户输入的循环
- 是否可以在基于范围的 for 循环中使用模板化的开始/结束方法
- WebSocket++服务器结束,但端口显示仍在使用中
- C++ 在不知道迭代何时结束时使用 for 循环
- 为什么 std::variant 使用开始和结束迭代器进行编译?
- C :使用文件末端(CTRL Z)结束一个循环似乎打破了我程序的其余部分
- 接收recv数据,直到流结束(使用HTTP)
- 在结束使用该对象之前调用析构函数来析构对象
- 结束使用 ShellExecute 函数启动的C++程序的最佳方法是什么?