WinInet如何使用sock代理
WinInet how to use sock proxy
我想使用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 %sn", socket);
success = true;
}
else
{
printf("Failed to set socket to %sn", 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);
更新:
使用此代码,我能够获得代理集。
但是,出于某种原因,它只允许我在进程运行时设置一次代理,再也不能设置了:
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
设置它。
要使用SOCKS代理,请尝试使用CERN_PROXY_INTERNET_ACCESS
而不是INTERNET_OPEN_TYPE_PROXY
。并将SOCKS5=
更改为SOCKS=
。
此外,您的changeProxy()
函数有几个逻辑错误。您从char[]
到LPCTSTR
的类型转换是可疑和错误的,而且您实际上并没有在列表中提供任何代理服务器。
相关文章:
- 代理对象的常量正确性
- 有什么好的方法可以让系统调用代理允许在单元测试中进行模拟
- 具有所表示类的相同构造函数签名的代理类模板
- 类型为 'std::map< char,int > 的 <Swig 对象的代理
- 我如何知道QNetWorkReped来自哪个代理?
- C++向量初始化遗传算法的代理向量
- 类(可能是代理)的命名,允许在不修改基础容器的情况下对项目进行排序和删除
- 如何将HTTPS流量重定向到本地主机:443上的代理?
- 适用于 Linux 的 c++ 上的代理脚本
- SNMP 代理在单元测试期间断开连接
- 模板代理方法无法编译
- 对于代理容器上的迭代器来说,"least bad implementation"可能是什么?
- 如何在ZMQ代理中记录接收消息?
- C++ boost::asio https 通过代理
- 使用函数指针作为成员函数的代理
- 摆脱 TCP 代理中的提升依赖关系. boost::system::error_code等效
- 如何使用Qt在D-Bus上创建/实例化配对代理
- WinHTTP 自动代理不起作用
- 为流运算符返回代理类时解压缩参数
- WinInet如何使用sock代理