WinHttpSendRequest失败,出现ERROR_WINHTTP_SECURE_FAILURE

时间:2017-11-29 13:49:53

标签: c winapi

以编程方式与网络通信并不是我的专业领域,但我设法通过剪切和粘贴在线找到的示例中的代码来创建read_web_page()函数,并且代码每天都在没有错误的情况下工作了好几个月。 / p>

事实上我的主Windows-10 PC出现故障,等待它被修复,我现在被迫从家里的Windows-7 PC运行(相同)代码。

但现在我出现了一个我从未见过的错误。我调用以下代码(简化):

    // code to handle bad return values from the following three functions ommitted...

    HINTERNET hsession = WinHttpOpen(0,WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME,WINHTTP_NO_PROXY_BYPASS, 0);

    HINTERNET hconnect = WinHttpConnect(hsession, (LPCWSTR)thewebsite, INTERNET_DEFAULT_HTTPS_PORT , 0);

    HINTERNET hrequest = WinHttpOpenRequest(hconnect, L"GET", (LPCWSTR)thesubdirectory, NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_SECURE);

    if (!WinHttpSendRequest(hrequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0))
    {
        int err = GetLastError();

通常,WinHttpSendRequest返回零但现在返回非零值,GetLastError()返回值12175(等于ERROR_WINHTTP_SECURE_FAILURE)。

我连接的(https)网址一直都是一样的,当我在浏览器中输入时,该网站仍然显示正常。

也许PC和位置的整体变化是巧合而且问题是由我正在阅读的网站内部的变化导致的(这不在我的控制之下)......但我不知道如何开始诊断(或修复)故障。这可能与我的ISP有关吗?

documentation for WinHttpSendRequest表示通过设置回调函数可以找到更详细的信息,但是描述如何完成此操作的文档对我来说是不可理解的,我无法在任何地方找到任何示例代码。

编辑:为了解决Barmak对网站和子目录的担忧,创建它们的代码如下:

char *char_thewebsite = "www.thewebsite.com";
char *char_thesubdirectory = "sub";

int n_website = MultiByteToWideChar(CP_ACP, 0, char_thewebsite, -1, NULL, 0);
int n_subdir = MultiByteToWideChar(CP_ACP, 0, char_thesubdirectory, -1, NULL, 0);

thewebsite = new WCHAR[n_website];
thesubdirectory = new WCHAR[n_subdir];

MultiByteToWideChar(CP_ACP, 0, char_thewebsite, -1, (LPWSTR)thewebsite, n_website);
MultiByteToWideChar(CP_ACP, 0, char_thesubdirectory, -1, (LPWSTR)thesubdirectory, n_subdir);

1 个答案:

答案 0 :(得分:2)

这是一个很长的评论而不是答案!

WinINet更容易,如果您不需要WinHTTP服务器功能,可以使用WinINet库。但是,您不能同时使用WinINet和WinHTTP。

声明字符串时,最好从UTF-16字符串wchar_t *str = L"str"开始。有时您的源字符串是UTF-8,在这种情况下,您可以使用MultiByteToWideChar(CP_UTF8...)转换为UTF-16。

WinINet示例:

#include <iostream>
#include <fstream>
#include <Windows.h>
#include <WinINet.h>

#pragma comment(lib, "WinINet.lib")

int main()
{
    const wchar_t* url = L"https://stackoverflow.com/questions";
    std::ofstream fout(L"c:\\test\\test.htm");
    HINTERNET hopen = InternetOpen(L"MyAppName",
        INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
    if(hopen)
    {
        DWORD flags = INTERNET_FLAG_DONT_CACHE;
        if(wcsstr(url, L"https://") == url)
            flags |= INTERNET_FLAG_SECURE;
        HINTERNET hinternet = InternetOpenUrl(hopen, url, NULL, 0, flags, 0);
        if(hinternet)
        {
            char buf[1024];
            DWORD received = 0;
            while(InternetReadFile(hinternet, buf, sizeof(buf), &received))
            {
                if(!received) break;
                fout.write(buf, received);
            }
            std::cout << "success!\n";
            InternetCloseHandle(hinternet);
        }
        InternetCloseHandle(hopen);
    }
    return 0;
}