首页 > 解决方案 > 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++linuxhttprequestfreeze

解决方案


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


推荐阅读