【问题标题】:C++ download file from https从 https 下载 C++ 文件
【发布时间】:2016-12-29 14:55:47
【问题描述】:

我目前正在使用此功能从 http 下载文件,但无法使其适用于带有 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;
}

有没有办法在不使用 curl 的情况下从 https 下载文件?如果可能的话,我更愿意使用套接字或 Boost。如有必要,我想从 BitBucket 下载文件。

非常感谢!

【问题讨论】:

  • 检查libcurl,或url download to file的具体示例。
  • 您的代码不适用于 HTTPS,因为它没有尝试使用 SSL/TLS 做任何事情。如果您不想使用 cURL,则必须在套接字代码之上使用 SSL/TLS 库,例如 OpenSSL、Microsoft 自己的 SChannel,或者可能是 WinSock 安全扩展。或者使用像 Asio 这样的 3rd 方套接字库。 SSL/TLS 需要手动实现很多工作。
  • 而且仅供参考,您现有的代码甚至远未接近可行或准确的 HTTP 客户端实现。如果您不想使用第三方库,可以使用 Microsoft 的 WinInet 或 WinHTTP API 发送 HTTP/HTTPS 请求。

标签: c++ file https download


【解决方案1】:

如果您使用的是 Linux,您可以使用 C++ 调用 shell 命令并轻松下载。我发现它比为此编写实际的 C++ 代码要容易得多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-27
    • 1970-01-01
    • 2016-11-30
    • 1970-01-01
    • 2014-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多