2

好吧,我想使用默认的 Internet Explorer 连接代理设置在 C++ 中的 cURL 中发出请求,这是我的示例代码:

CURL *curl;
CURLcode result;

curl = curl_easy_init();

char errorBuffer[CURL_ERROR_SIZE];

if (curl)
{
// Now set up all of the curl options
curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errorBuffer);
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_HEADER, 0);
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "cookies.txt");

// Attempt to retrieve the remote page
result = curl_easy_perform(curl);

// Always cleanup
curl_easy_cleanup(curl);
}

如何检索代理 Internet Explorer 设置,然后传递给我的 cURL,以便它能够使用代理发出请求?

提前致谢。

4

3 回答 3

2

WinHttpGetIEProxyConfigForCurrentUser 函数检索当前用户的 Internet Explorer 代理配置。

    #include "stdafx.h" 
#include <Windows.h>
#include <Winhttp.h>
#include <iostream>

using namespace std;
void main() 
{ 
    WINHTTP_CURRENT_USER_IE_PROXY_CONFIG MyProxyConfig;

    if(!WinHttpGetIEProxyConfigForCurrentUser(&MyProxyConfig))
    { 
        //check the error DWORD Err = GetLastError(); 
        DWORD Err = GetLastError(); 
        cout << "WinHttpGetIEProxyConfigForCurrentUser failed with the following error number: " << Err << endl;
        switch (Err) 
       {
            case ERROR_FILE_NOT_FOUND: 
            cout << "The error is ERROR_FILE_NOT_FOUND" << endl; 
            break; 
            case ERROR_WINHTTP_INTERNAL_ERROR:
            cout << "ERROR_WINHTTP_INTERNAL_ERROR" << endl; 
            break; 
            case ERROR_NOT_ENOUGH_MEMORY:
            cout << "ERROR_NOT_ENOUGH_MEMORY" << endl; 
            break; 
            default: cout << "Look up error in header file." << endl; 
        }//end switch 
    }//end if 
    else 
    { 
        //no error so check the proxy settings and free any strings 
        cout << "Auto Detect is: " << MyProxyConfig.fAutoDetect << endl; 

        if(NULL != MyProxyConfig.lpszAutoConfigUrl) 
        { 
            wcout << "AutoConfigURL (MyProxyConfig.lpszAutoConfigUrl) is: " << MyProxyConfig.lpszAutoConfigUrl << endl; 
            GlobalFree(MyProxyConfig.lpszAutoConfigUrl);
        } 
        if(NULL != MyProxyConfig.lpszProxy) 
        { 
            wcout << "AutoConfigURL (MyProxyConfig.lpszProxy) is: " << MyProxyConfig.lpszProxy << endl;
            GlobalFree(MyProxyConfig.lpszProxy);
         }
        if(NULL != MyProxyConfig.lpszProxyBypass) 
        {
             wcout << "AutoConfigURL (is: " << MyProxyConfig.lpszProxyBypass << endl;                      
             GlobalFree(MyProxyConfig.lpszProxyBypass); 
        }
    }//end else 
    cout << "finished!"; 
    system("PAUSE");
}//end main
于 2012-09-26T12:10:58.513 回答
0

首先,使用 windows api 获取代理服务器,然后使用 curl_easy_setopt 将代理设置为 curl。

获取代理: WinHttpGetIEProxyConfigForCurrentUser这个api可以获取代理,但是没有WPAD。如果有人使用“使用自动代理配置”,应该使用WinHttpGetProxyForUrlapi来获取代理。全部在msdn: http: //msdn.microsoft.com/en-us/library/windows/desktop/aa384096(v=vs. 85).aspx

设置代理:curl_easy_setopt(hCurl, CURLOPT_PROXY, astrProxy.c_str());

于 2013-06-30T14:36:45.423 回答
0

您想使用InternetQueryOptionwith INTERNET_OPTION_PROXY( documentation ) 来查找当前的代理设置,然后只需将代理设置正常传递给 curl 即可

于 2012-05-03T13:06:10.017 回答