使用 WinHttp 通过代理发送 HTTP 请求的代码 [英] Code to send an HTTP request through a proxy using WinHttp

查看:223
本文介绍了使用 WinHttp 通过代理发送 HTTP 请求的代码的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用 Winhttp.lib 库将 C++ 中的 HTTP 请求发送到远程服务器.

I am using the Winhttp.lib library to send an HTTP request in C++ to a remote server.

在客户端,HTTP 请求必须发送到 IP 为 W.X.Y.Z 且端口为 1234 的代理.

On the client side, the HTTP request has to be sent to a proxy which IP is W.X.Y.Z and which port is 1234.

根据函数原型 WinHttpOpen() (https://msdn.microsoft.com/en-us/library/windows/desktop/aa384098%28v=vs.85%29.aspx),特别是参数dwAccessTypepwszProxyNamepwszProxyBypass,看起来这是必须告知代理的函数.

According to the prototype of the function WinHttpOpen() (https://msdn.microsoft.com/en-us/library/windows/desktop/aa384098%28v=vs.85%29.aspx), in particular the parameters dwAccessType, pwszProxyName and pwszProxyBypass, it looks like this is the function which has to be told about the proxy.

如何告诉 WinHttpOpen() 函数发送 HTTP 请求的代理是 (IP = W.X.Y.Z, PORT = 1234)?

How do I tell the WinHttpOpen() function that the proxy to send the HTTP request to is (IP = W.X.Y.Z, PORT = 1234)?

结构 WINHTTP_PROXY_INFO (https://msdn.microsoft.com/en-us/library/windows/desktop/aa383912%28v=vs.85%29.aspx) 看起来很有趣,但我知道怎么做与 WinHttpOpen() 结合使用.

The structure WINHTTP_PROXY_INFO (https://msdn.microsoft.com/en-us/library/windows/desktop/aa383912%28v=vs.85%29.aspx) looks interesting but I do know how to use it in combination with WinHttpOpen().

谢谢.

推荐答案

您是否尝试过带有 WINHTTP_OPTION_PROXY 标志的 WinHttpSetOption?大致如下:

Have you tried WinHttpSetOption with the WINHTTP_OPTION_PROXY flag? It would look roughly like this:

    hSession = WinHttpOpen(L"WinHTTP Example/1.0",
        WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
        WINHTTP_NO_PROXY_NAME,
        WINHTTP_NO_PROXY_BYPASS, 0);        
    WINHTTP_PROXY_INFO proxy = { 0 };
    proxy.dwAccessType = WINHTTP_ACCESS_TYPE_NAMED_PROXY;
    proxy.lpszProxy = L"http://127.0.0.1:1234;http://blarg.com:4545";
    if (!WinHttpSetOption(hSession, WINHTTP_OPTION_PROXY, &proxy, sizeof(proxy)))
    {
        wprintf(L"Unable to set proxy.\n");
    }
    else
    {
        HINTERNET hRequest = WinHttpOpenRequest(hConnect, L"GET", NULL, NULL,
            WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_SECURE);
        char* username = "username";
        WinHttpSetOption(hRequest, WINHTTP_OPTION_PROXY_USERNAME, username, strlen(username));
        WinHttpSetOption(hRequest, WINHTTP_OPTION_PROXY_PASSWORD, password, strlen(password));

        [ ... ]
    }

以上内容会将您的会话设置为使用两个代理... 127.0.0.1:1234 和 blarg.com:4545.如果需要,您还可以使用 https 更改方案.它将使用 WINHTTP_OPTION_PROXY_USERNAME 和 WINHTTP_OPTION_PROXY_PASSWORD 选项设置代理用户名和密码的参数.

The above would set your session to use two proxies... 127.0.0.1:1234, and blarg.com:4545. You can also change the scheme using https if you need. It would set parameters for the proxy username and password using the WINHTTP_OPTION_PROXY_USERNAME, and WINHTTP_OPTION_PROXY_PASSWORD options.

请注意,我几乎没有执行过错误检查.您通常希望确保正确设置选项等.

Please note I've performed little to no error checking. You would normally want to ensure the options were set properly, etc.

这篇关于使用 WinHttp 通过代理发送 HTTP 请求的代码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆