C++ WinInet如何使用sock代理

C++ WinInet如何使用sock代理,c++,proxy,wininet,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代理没有被使用,而是我实际的普通互联网 我甚至还制作了一个

我想使用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()函数之前调用此函数,但出于任何原因,它不使用代理,而是使用我的普通internet

这是我的连接代码片段

 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);
**

更新: ** 使用这段代码,我能够得到代理集

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

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);
我想在这样做一次后更改代理mid程序,但使用相同的代码,第二次更改代理不会生效

我甚至试着关上把手,重新安装,但没有成功

当试图使用

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

我得到的返回值为false,所以出于某种原因,它没有设置为那样。但使用INTERNET\u选项\u代理设置它

要使用SOCKS代理,请尝试使用
CERN\u proxy\u INTERNET\u ACCESS
而不是
INTERNET\u OPEN\u TYPE\u proxy
。并将
SOCKS5=
更改为
SOCKS=


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

感谢您提供的提示。如果InternetOpenA()函数中的CERN_代理更改修复了代理设置问题,是否需要changeProxy()函数?@mocode9我不确定,但您不应该使用
internetoption\u PROXY
作为开始,而是使用
internetoption\u PER\u CONNECTION\u OPTION
。看,我让它工作了,但它似乎只改变了一次代理设置。我希望能够在以后的程序中再次更改它们,以防代理不再有效。但在第一次改变之后,随后的改变似乎没有任何效果。有什么想法吗?@mocode9:你用哪个选项来设置它<代码>互联网选项\u代理应用于静态全局设置,而
互联网选项\u每个连接\u选项
必须应用于您打开的每个
互联网
句柄。请查看您的最新代码。您不能为不同的连接重用WinInet句柄,切换代理需要建立新的连接。这实际上不是WinInet的限制。即使您降低到TCP层并手动实现SOCKS和HTTP,您仍然无法做到这一点。您可以在HTTP请求之间切换代理,但不能在同一连接上切换代理,您必须先断开现有连接。