Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从internet下载文件,HttpSendRequest失败,错误代码为_C++_Windows - Fatal编程技术网

C++ 从internet下载文件,HttpSendRequest失败,错误代码为

C++ 从internet下载文件,HttpSendRequest失败,错误代码为,c++,windows,C++,Windows,我正在创建一个可以从互联网下载文件的程序。 在下载文件之前,我想获得文件大小,我尝试了InternetQueryDataAvailable,但它给出的值为0 然后我尝试了hHttpRequest,但它给出了错误代码error\u HTTP\u HEADER\u NOT\u FOUND。所以我添加了HttpSendRequest,但它给出的错误代码是error\u INTERNET\u无效的\u URL 我使用avg站点作为测试站点: 要下载的文件: avg_free_x86_all_2014_

我正在创建一个可以从互联网下载文件的程序。 在下载文件之前,我想获得文件大小,我尝试了InternetQueryDataAvailable,但它给出的值为0

然后我尝试了hHttpRequest,但它给出了错误代码error\u HTTP\u HEADER\u NOT\u FOUND。所以我添加了HttpSendRequest,但它给出的错误代码是error\u INTERNET\u无效的\u URL

我使用avg站点作为测试站点:

要下载的文件: avg_free_x86_all_2014_4259a6848.exe

任何帮助都很好,谢谢

代码:


调用
InternetConnect()
时,仅为主机名指定
“download.avgfree.com”
,而不是URL

调用
HttpOpenRequest()
时,指定
“/filedir/inst/avg\u free\u x86\u all\u 2014\u 4259a6848.exe”
作为请求的对象,而不是文件名本身

用于将完整URL划分为各个组件,将
lpszHostName
nPort
字段传递给
InternetConnect()
,将
lpszUrlPath
字段传递给
HttpOpenRequest()

下载时也不需要知道文件大小。事实上,下载开始时,有时不知道文件大小。有时候会有。无论哪种方式,您都可以在循环中调用
InternetReadFile()
,直到它报告没有更多数据可接收为止。让它在内部为您处理文件大小


顺便说一句,看看这个函数。让它为您处理这些详细信息。

调用
InternetConnect()
时,只需为主机名指定
“download.avgfree.com”
,而不是URL

调用
HttpOpenRequest()
时,指定
“/filedir/inst/avg\u free\u x86\u all\u 2014\u 4259a6848.exe”
作为请求的对象,而不是文件名本身

用于将完整URL划分为各个组件,将
lpszHostName
nPort
字段传递给
InternetConnect()
,将
lpszUrlPath
字段传递给
HttpOpenRequest()

下载时也不需要知道文件大小。事实上,下载开始时,有时不知道文件大小。有时候会有。无论哪种方式,您都可以在循环中调用
InternetReadFile()
,直到它报告没有更多数据可接收为止。让它在内部为您处理文件大小


顺便说一句,看看这个函数。让它来为您处理这些细节。

感谢您快速而出色的回答。对于使用HttpQueryInfo获取文件大小的任何人,请确保包含HTTP\u QUERY\u FLAG\u NUMBER FLAG。感谢您快速而出色的回答。对于使用HttpQueryInfo获取文件大小的任何人,请确保包含HTTP\u QUERY\u标志\u NUMBER标志。
DWORD DownloadFile(PCHAR SaveDirectory)
{
HINTERNET hInternet;
CHAR StrBuffer[100];

hInternet = InternetOpen(InternetAgent, PRE_CONFIG_INTERNET_ACCESS, NULL, INTERNET_INVALID_PORT_NUMBER, 0);
if (hInternet != NULL)
{
    CHAR TestUrl[] = "http://download.avgfree.com/filedir/inst";
    CHAR TestFileName[] = "avg_free_x86_all_2014_4259a6848.exe";

    HINTERNET hHttpSession = InternetConnect(hInternet, TestUrl, INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
    if (hHttpSession != NULL)
    {
        PCTSTR AcceptTypes[] = {"text/*", "application/exe", "application/zlib", "application/gzip", "application/applefile", NULL};
        //I dont think application/exe is valid, but i could Not find a .exe format in the msdn list.
        //http://www.iana.org/assignments/media-types/media-types.xhtml#application for the list

        HINTERNET hHttpRequest = HttpOpenRequest(hHttpSession, "GET", TestFileName, "HTTP/1.1", TestUrl, &AcceptTypes[0],
            INTERNET_FLAG_EXISTING_CONNECT|INTERNET_FLAG_RELOAD|INTERNET_FLAG_DONT_CACHE, 0);

        if (hHttpRequest != NULL)
        {
            DWORD FileSize = 0;
            DWORD BufferLength = sizeof(FileSize);

            if (HttpSendRequest(hHttpRequest, NULL, 0, NULL, 0))
            {
                //See if HttpQueryInfo can get the file size.
                if (HttpQueryInfo(hHttpRequest, HTTP_QUERY_CONTENT_LENGTH, &FileSize, &BufferLength, NULL))
                {
                    sprintf_s(StrBuffer, sizeof(StrBuffer), "%u", FileSize);
                    MessageBox(MainWinHwnd, StrBuffer, "File Size", MB_OK);
                }
                else MessageBox(MainWinHwnd, "Failed to get the file size.", NULL, MB_OK);

                //See if InternetQueryDataAvailable can get the file size.
                if (InternetQueryDataAvailable(hHttpRequest, &FileSize, 0, 0))
                {
                    sprintf_s(StrBuffer, sizeof(StrBuffer), "%u", FileSize);
                    MessageBox(MainWinHwnd, StrBuffer, "File Size", MB_OK);
                }
                else
                {
                    MessageBox(MainWinHwnd, "Failed to get the file size.", NULL, MB_OK);
                }
            }
            else
            {
                DWORD LastError = GetLastError();
                sprintf_s(StrBuffer, sizeof(StrBuffer), "%u", LastError);
                MessageBox(NULL, StrBuffer, NULL, MB_OK);
            }
            InternetCloseHandle(hHttpRequest);
        }
        else MessageBox(NULL, "Error #3", NULL, MB_OK);
        InternetCloseHandle(hHttpSession);
    }
    else MessageBox(NULL, "Error #2", NULL, MB_OK);
    InternetCloseHandle(hInternet);
}
else MessageBox(NULL, "Error #1", NULL, MB_OK);

return TRUE;
}