c++ - C++ HTTP 客户端在 GET 请求后挂起 read() 调用
问题描述
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()
(它为您提供存储在其中的值HTTPRequest
的字节数),而不是sizeof(HTTPrequest)
(它为您提供std::string
自身所需的字节数)。
推荐阅读
- mysql - 为什么mysql案例条件无法正常工作
- java - JavaFX:应用于标签的 setText() 会冻结多线程客户端-服务器应用程序中的 UI
- autodesk-forge - ManifestChildren 在 Forge PHP SDK 中抛出 InvalidArgumentException
- excel - 如何在文件路径字符串中使用分配给变量的单元格值?
- reactjs - 将 redux devtools 与自己的商店连接
- c# - 无法使用内容同步操作 (syncrepl) 从 OpenLDAP 服务器获取已删除的项目
- build - 如何对诸如 Build/Rebuild 之类的 msbuild 内置目标设置条件?
- javascript - JavaScript:以像素为单位获取背景位置
- c# - 如何禁用 MaterialDesignInXaml 按钮动画?
- r - 我可以提取包含R中任何字符串向量的字符串吗