我正在用C ++编写一个简单的下载程序,它可以在向端口80发出HTTP请求时正常工作,但现在我一直在尝试更新代码以从HTTPS发出请求和下载文件,而我的recv方法总是返回长度为0。我尝试以不同的方式更改标头并使用Postman验证它,这些标头工作正常。不要理解发生了什么。
在我的代码中,我首先向服务器发送HEAD请求,以找出要下载的文件的大小,甚至HEAD请求也不会回来
这是我的sendRequest方法
void Client::sendRequest() {
ptr = request.c_str();
nleft = request.length();
// write the data to the server
while (nleft) {
if ((nwritten = send(s, ptr, nleft, 0)) < 0) {
if (errno == EINTR) {
// the socket call was interrupted -- try again
nwritten = 0;
} else {
// an error occurred, so break out
perror("write");
break;
}
} else if (nwritten == 0) {
cout << "the socket is closed" << endl;
// the socket is closed
break;
}
nleft -= nwritten;
ptr += nwritten;
}
}
发送请求后,我正在阅读此方法中的响应:
string Client::readResponse() {
// read the response
char buf[1024];
memset(buf, 0, 1024);
string downloaded;
while (true) {
long nread = recv(s, buf, 1024, 0);
downloaded.append(buf, nread);
if(downloaded.size() != 0) {
//check for \r\n\r\n to know it's the end of the header
if (downloaded.at(downloaded.length() - 1) == 10
&& downloaded.at(downloaded.length() - 3) == 10) {
break;
}
}
}
return downloaded;
}
对于使用HTTPS的网址上的HEAD请求,nread始终返回0(例如&#34; https://medpix.nlm.nih.gov/images/full/synpic54731.jpg&#34;)。 真的不确定发生了什么。 要求http://services.hanselandpetal.com/selfie%20dogs-488938505.jpg
的标题"HEAD /selfie%20dogs-488938505.jpg HTTP/1.1\r\nHost: services.hanselandpetal.com\r\n\r\n"
请求上面的https网址的标题:
"HEAD /images/full/synpic54731.jpg HTTP/1.1\r\nHost: medpix.nlm.nih.gov\r\n\r\n"