WinInet如何使用sock代理

时间:2017-01-09 02:48:09

标签: c++ proxy wininet

我想使用WinInet访问网页,但使用sock4 / sock5代理。

这是我尝试过的

HINTERNET hOpen = InternetOpenA(helper.USER_AGENT, INTERNET_OPEN_TYPE_PROXY, ("SOCKS5=200.100.5.1:702", NULL, 0);

这似乎不起作用,我提供了一个无效的sock代理,以便当它进行网页连接时它不应该通过,但是在我的测试中它意味着sock代理没有被使用但是而是我的实际普通互联网。

我甚至做了一个辅助函数来设置InternetSetOption中的代理

bool changeProxy(const char* socket) {
char strProxyList[MAX_PATH];
bool success = false;

memset(strProxyList, 0, MAX_PATH);

lstrcpyA(strProxyList, "SOCKS5=");

INTERNET_PROXY_INFO proxy;

proxy.dwAccessType = INTERNET_OPEN_TYPE_PROXY;
proxy.lpszProxy = (LPCTSTR)strProxyList;
proxy.lpszProxyBypass = NULL;

if (TRUE == InternetSetOptionA(hOpen, INTERNET_OPTION_PROXY, &proxy, sizeof(INTERNET_PROXY_INFO)))
{
    printf("Socket set to %s\n", socket);
    success = true;
}
else
{
    printf("Failed to set socket to %s\n", socket);
}

InternetSetOptionA(NULL, INTERNET_OPTION_PROXY_SETTINGS_CHANGED, NULL, 0);
return success;

}

我尝试在InternetOpenA()之后和InternetConnectA()函数之前调用此函数,但无论出于何种原因,它都不使用代理,而是使用普通的互联网。

这是我的连接代码段。

 hConnect = InternetConnectA(hOpen, host, INTERNET_DEFAULT_HTTPS_PORT, NULL, NULL, 3, 0, 0);
hRequest = HttpOpenRequestA(hConnect, "POST", uri, NULL, CHECKER_URL, NULL, INTERNET_FLAG_SECURE, 0);

**

UPDATE:

**

使用此代码我可以获得代理集。

但由于某种原因,它只允许我设置代理一次,而不是在进程运行时再次设置代理。

HINTERNET hOpen = InternetOpenA(helper.USER_AGENT, 0, NULL, NULL, 0);
INTERNET_PROXY_INFO proxy = { 0 };

proxy.dwAccessType = INTERNET_OPEN_TYPE_PROXY;
proxy.lpszProxy = (LPCTSTR)socket;
proxy.lpszProxyBypass = NULL;

if (UrlMkSetSessionOption(INTERNET_OPTION_PROXY, &proxy, sizeof(proxy), 0) != 0)
{
    success = false;
}
UrlMkSetSessionOption(INTERNET_OPTION_PROXY_SETTINGS_CHANGED, NULL, 0, 0);

我想在执行此操作后更改代理中间程序,但使用相同的代码,代理更改第二次不会生效。

我甚至尝试关闭手柄并重新实例化但没有运气。

尝试使用时

InternetSetOptionA(hOpen, INTERNET_OPTION_PER_CONNECTION_OPTION, &proxy, sizeof(INTERNET_PROXY_INFO)))

我得到的返回值为false,因此不会出于某种原因设置该方式。但是使用INTERNET_OPTION_PROXY设置它。

1 个答案:

答案 0 :(得分:0)

要使用SOCKS代理,请尝试使用CERN_PROXY_INTERNET_ACCESS代替INTERNET_OPEN_TYPE_PROXY。并将SOCKS5=更改为SOCKS=

此外,您的changeProxy()函数有几个逻辑错误。您从char[]LPCTSTR的类型转换是可疑和错误的,并且您实际上并未在列表中提供任何代理服务器。