C++ HTTP 客户端在 GET 请求后挂起 read() 调用

标签 c++ linux http request freeze

std::string HTTPrequest = "GET /index.html HTTP/1.1\r\nHost: www.yahoo.com\r\nConnection: close\r\n\r\n";

write(socket, HTTPrequest.c_str(), sizeof(HTTPrequest));

char pageReceived[4096];

int bytesReceived = read(socket, pageReceived, 4096);

我有一个从我的终端运行的 HTTP 客户端程序。我还有一个网络服务器程序。使用网络服务器作为测试,我可以验证套接字创建和附件是否正常工作。

我如上所示创建请求,然后写入套接字。使用 print 语句,我可以看到代码超出了 write 调用。但是,它卡在读取调用上。

我不知道发生了什么 - 我的格式根据请求看起来是正确的。

有什么想法吗?当我连接到我的网络服务器时,一切似乎都运行良好,但 www.yahoo.com 和 www.google.com 都会导致挂起。我在 Linux 上。

最佳答案

在 C 和 C++ 中,sizeof 为您提供了保存一个类型所需的字节数,无论其内容如何。所以你没有发送完整的请求,只有 sizeof(std::string) 字节。您需要 HTTPRequest.size()(它为您提供 value 存储在 HTTPRequest 中的字节数),而不是 sizeof( HTTPrequest)(它为您提供 std::string 本身所需的字节数)。

关于C++ HTTP 客户端在 GET 请求后挂起 read() 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58535465/

相关文章:

'{' 标记之前的 C++ 错误预期类名

c++ - Qthread多线程意外结果

http - connect/express 如何在特定目录上使用非过期缓存

linux - AWK 查找两个模式并打印以作为命令执行

c - 如何找到每个用户的磁盘空间使用情况?

http - 找不到页面 - 显示其他可能的页面。返回 404 还是 301?

php - 在 php 中获取多 curl 响应时,如何控制接收数据的顺序?

c++ - 在没有 this-> 或 RealType::的情况下解析依赖模板类型:

c++ - 使用用户定义的随机生成器运行 std::normal_distribution

c - 用于检查超出的任何数据类型的最大值的 API