настоящее время я использую эту функцию для загрузки файлов с HTTP, но не может заставить его работать на URLs с https:C++ загрузить файл с HTTPS
bool DownloadFile(string url, LPCSTR filename){
string request; // HTTP Header //
char buffer[BUFFERSIZE];
struct sockaddr_in serveraddr;
int sock;
WSADATA wsaData;
int port = 80;
if(url.find("http://") != -1){
string temp = url;
url = temp.substr(url.find("http://") + 7);
}
int dm = url.find("/");
string file = url.substr(dm);
string shost = url.substr(0, dm);
request += "GET " + file + " HTTP/1.0\r\n";
request += "Host: " + shost + "\r\n";
request += "\r\n";
if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0)
return FALSE;
if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
return FALSE;
memset(&serveraddr, 0, sizeof(serveraddr));
hostent *record = gethostbyname(shost.c_str());
in_addr *address = (in_addr *)record->h_addr;
string ipd = inet_ntoa(* address);
const char *ipaddr = ipd.c_str();
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = inet_addr(ipaddr);
serveraddr.sin_port = htons(port);
if (connect(sock, (struct sockaddr *) &serveraddr, sizeof(serveraddr)) < 0)
return FALSE;
if (send(sock, request.c_str(), request.length(), 0) != request.length())
return FALSE;
int nRecv, npos;
nRecv = recv(sock, (char*)&buffer, BUFFERSIZE, 0);
string str_buff = buffer;
npos = str_buff.find("\r\n\r\n");
HANDLE hFile;
hFile = CreateFileA(filename, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
SetFilePointer(hFile, 0, NULL, FILE_BEGIN);
DWORD ss;
while((nRecv > 0) && (nRecv != INVALID_SOCKET)){
if(npos > 0){
char bf[BUFFERSIZE];
memcpy(bf, buffer + (npos + 4), nRecv - (npos + 4));
WriteFile(hFile, bf,nRecv - (npos + 4), &ss, NULL);
}else{
WriteFile(hFile, buffer, nRecv, &ss, NULL);
}
ZeroMemory(&buffer, sizeof(buffer));
nRecv = recv(sock, (char*)&buffer, BUFFERSIZE, 0);
str_buff = buffer;
npos = str_buff.find("\r\n\r\n");
}
CloseHandle(hFile);
closesocket(sock);
WSACleanup();
return TRUE;
}
Есть ли способ для загрузки файлов с HTTPS без завитка ? Я бы предпочел, чтобы это было сделано с помощью сокетов или Boost, если это возможно. Если необходимо, я хочу загрузить файл из BitBucket.
Большое спасибо!
Проверьте [libcurl] (https://curl.haxx.se/libcurl/) или конкретный пример для загрузки [url в файл] (https://curl.haxx.se/libcurl/c/url2file.html). – mvp
Возможный дубликат [SSL-сертификатов и Boost asio] (http://stackoverflow.com/questions/28264313/ssl-certificates-and-boost-asio) – TessellatingHeckler
Ваш код не работает с HTTPS, потому что он не пытается сделать все с SSL/TLS. Если вы не хотите использовать cURL, вам придется использовать библиотеку SSL/TLS поверх кода сокета, например OpenSSL, собственный SChannel от Microsoft или, возможно, расширения WinSock Security Extensions. Или используйте стороннюю библиотеку сокетов, такую как Asio. SSL/TLS - это много работы для реализации вручную. –