侦测IE的代理服务器

http://blog.csdn.net/cnjet/article/details/8284127

所有的网络程序使用HTTP服务时,必然会遇到可能需要检测代理服务器的情况,程序可以提供界面供玩家设置,但是更常用的一种方式是自动检测IE浏览器的代理设置,并以此为代理来设置应用程序的代理信息,Opera, Firefox, Chrome等主流浏览器都是如此。以下程序使用WinHTTP的API实现自动的代理检测,支持“自动检测”,“自动检测代理文件”,“手动设置”,无代理等各种情况。

[cpp] view plaincopy

  1. int GetHTTPProxyFromIE(const WCHAR* url, /*out*/std::wstring &server )
  2. {
  3. BOOL                      auto_proxy = FALSE;
  4. WINHTTP_AUTOPROXY_OPTIONS auto_proxy_option;
  5. WINHTTP_PROXY_INFO        auto_proxy_info;
  6. ZeroMemory( &auto_proxy_option, sizeof(WINHTTP_AUTOPROXY_OPTIONS) );
  7. ZeroMemory( &auto_proxy_info, sizeof(WINHTTP_PROXY_INFO) );
  8. //
  9. // convert URL from mbs to wchar
  10. //
  11. const WCHAR* url_request = L"http://www.youtube.com";
  12. if( NULL!=url && wcslen(url)>0 )
  13. url_request = url;
  14. server = L"";
  15. //
  16. // Create the WinHTTP session.
  17. //
  18. HINTERNET http_session = WinHttpOpen( L"ProxyDetect/1.0",
  19. WINHTTP_ACCESS_TYPE_NO_PROXY,
  20. WINHTTP_NO_PROXY_NAME,
  21. WINHTTP_NO_PROXY_BYPASS,
  22. 0 );
  23. if( NULL==http_session ) {
  24. return -2;
  25. }
  26. if (!WinHttpSetTimeouts( http_session, 30000, 30000, 0, 0)) {
  27. printf( "Error %u in WinHttpSetTimeouts.\n", GetLastError());
  28. WinHttpCloseHandle(http_session);
  29. return -3;
  30. }
  31. //
  32. // Check if need auto proxy.
  33. //
  34. WINHTTP_CURRENT_USER_IE_PROXY_CONFIG ie_config;
  35. if( WinHttpGetIEProxyConfigForCurrentUser(&ie_config) ) {
  36. if( ie_config.fAutoDetect )
  37. auto_proxy = TRUE;
  38. if( NULL!=ie_config.lpszAutoConfigUrl ) {
  39. auto_proxy = TRUE;
  40. auto_proxy_option.lpszAutoConfigUrl = ie_config.lpszAutoConfigUrl;
  41. }
  42. } else {
  43. // Error, Try to auto proxy.
  44. auto_proxy = TRUE;
  45. }
  46. //
  47. // request auto detect to get proxy info.
  48. //
  49. if( auto_proxy ) {
  50. // Setting auto detect options
  51. if( NULL!=auto_proxy_option.lpszAutoConfigUrl ) {
  52. auto_proxy_option.dwFlags = WINHTTP_AUTOPROXY_CONFIG_URL;
  53. } else {
  54. auto_proxy_option.dwFlags = WINHTTP_AUTOPROXY_AUTO_DETECT;
  55. auto_proxy_option.dwAutoDetectFlags = WINHTTP_AUTO_DETECT_TYPE_DHCP|WINHTTP_AUTO_DETECT_TYPE_DNS_A;
  56. }
  57. // basic flags you almost always want
  58. auto_proxy_option.fAutoLogonIfChallenged = TRUE;
  59. // here we reset fAutoProxy in case an auto-proxy isn‘t actually
  60. // configured for this URL
  61. auto_proxy = WinHttpGetProxyForUrl(http_session, url_request, &auto_proxy_option, &auto_proxy_info );
  62. }
  63. //
  64. // Output result
  65. //
  66. if( auto_proxy ) {
  67. // set proxy options based on auto proxy info.
  68. server = auto_proxy_info.lpszProxy;
  69. } else  if( NULL!=ie_config.lpszProxy ) {
  70. // IE has an explicit proxy. set proxy options for libcurl here
  71. // based on ieProxyConfig
  72. //
  73. // note that sometimes IE gives just a single or double colon
  74. // for proxy or bypass list, which means "no proxy"
  75. server = ie_config.lpszProxy;
  76. } else {
  77. // there is no auto proxy and no manually configured proxy
  78. }
  79. //
  80. // Clean up.
  81. //
  82. if( ie_config.lpszAutoConfigUrl != NULL )
  83. GlobalFree(ie_config.lpszAutoConfigUrl);
  84. if( auto_proxy_info.lpszProxy != NULL )
  85. GlobalFree(auto_proxy_info.lpszProxy);
  86. if( auto_proxy_info.lpszProxyBypass != NULL )
  87. GlobalFree( auto_proxy_info.lpszProxyBypass );
  88. if( http_session != NULL )
  89. WinHttpCloseHandle( http_session );
  90. return 0;
  91. }

源代码

----------------------------------------

int GetHTTPProxyFromIE(const WCHAR* url, /*out*/std::wstring &server )
{
BOOL auto_proxy = FALSE;
WINHTTP_AUTOPROXY_OPTIONS auto_proxy_option;
WINHTTP_PROXY_INFO auto_proxy_info;

ZeroMemory( &auto_proxy_option, sizeof(WINHTTP_AUTOPROXY_OPTIONS) );
ZeroMemory( &auto_proxy_info, sizeof(WINHTTP_PROXY_INFO) );

//
// convert URL from mbs to wchar
//
const WCHAR* url_request = L"http://www.youtube.com";
if( NULL!=url && wcslen(url)>0 )
url_request = url;

server = L"";

//
// Create the WinHTTP session.
//
HINTERNET http_session = WinHttpOpen( L"ProxyDetect/1.0",
WINHTTP_ACCESS_TYPE_NO_PROXY,
WINHTTP_NO_PROXY_NAME,
WINHTTP_NO_PROXY_BYPASS,
0 );

if( NULL==http_session ) {
return -2;
}

if (!WinHttpSetTimeouts( http_session, 30000, 30000, 0, 0)) {
printf( "Error %u in WinHttpSetTimeouts.\n", GetLastError());

WinHttpCloseHandle(http_session);
return -3;
}

//
// Check if need auto proxy.
//
WINHTTP_CURRENT_USER_IE_PROXY_CONFIG ie_config;
if( WinHttpGetIEProxyConfigForCurrentUser(&ie_config) ) {
if( ie_config.fAutoDetect )
auto_proxy = TRUE;

if( NULL!=ie_config.lpszAutoConfigUrl ) {
auto_proxy = TRUE;
auto_proxy_option.lpszAutoConfigUrl = ie_config.lpszAutoConfigUrl;
}
} else {
// Error, Try to auto proxy.
auto_proxy = TRUE;
}

//
// request auto detect to get proxy info.
//
if( auto_proxy ) {
// Setting auto detect options
if( NULL!=auto_proxy_option.lpszAutoConfigUrl ) {
auto_proxy_option.dwFlags = WINHTTP_AUTOPROXY_CONFIG_URL;
} else {
auto_proxy_option.dwFlags = WINHTTP_AUTOPROXY_AUTO_DETECT;
auto_proxy_option.dwAutoDetectFlags = WINHTTP_AUTO_DETECT_TYPE_DHCP|WINHTTP_AUTO_DETECT_TYPE_DNS_A;
}

// basic flags you almost always want
auto_proxy_option.fAutoLogonIfChallenged = TRUE;

// here we reset fAutoProxy in case an auto-proxy isn‘t actually
// configured for this URL
auto_proxy = WinHttpGetProxyForUrl(http_session, url_request, &auto_proxy_option, &auto_proxy_info );
}

//
// Output result
//
if( auto_proxy ) {
// set proxy options based on auto proxy info.
server = auto_proxy_info.lpszProxy;
} else if( NULL!=ie_config.lpszProxy ) {
// IE has an explicit proxy. set proxy options for libcurl here
// based on ieProxyConfig
//
// note that sometimes IE gives just a single or double colon
// for proxy or bypass list, which means "no proxy"
server = ie_config.lpszProxy;
} else {
// there is no auto proxy and no manually configured proxy
}

//
// Clean up.
//
if( ie_config.lpszAutoConfigUrl != NULL )
GlobalFree(ie_config.lpszAutoConfigUrl);

if( auto_proxy_info.lpszProxy != NULL )
GlobalFree(auto_proxy_info.lpszProxy);

if( auto_proxy_info.lpszProxyBypass != NULL )
GlobalFree( auto_proxy_info.lpszProxyBypass );

if( http_session != NULL )
WinHttpCloseHandle( http_session );

return 0;
}

参考信息:

http://curl.haxx.se/mail/lib-2001-08/att-0170/winproxy.c

http://stackoverflow.com/questions/202547/how-do-i-find-out-the-browsers-proxy-settings

时间: 2024-10-05 04:01:18

侦测IE的代理服务器的相关文章

代理服务器的概要知识

一.什么是代理服务器? 代理服务器英文全称是Proxy Server,其功能就是代理网络用户去取得网络信息.形象的说:它是网络信息的中转站. 在一般情况下,我们使用网络浏览器直接去连接其他Internet站点取得网络信息时,需送出Request信号来得到回答,然后对方再把信息以bit方式传送回来.代理服务器是介于浏览器和Web服务器之间的一台服务器,有了它之后,浏览器不是直接到Web服务器去取回网页而是向代理服务器发出请求, Request信号会先送到代理服务器,由代理服务器来取回浏览器所需要的

代理服务器和网络地址转换NAT

一.代理服务器 1.代理服务器的基本概念 代理服务器是网络信息的中转站,简单来说就是个人网络和因特网服务商之间的代理机构,它负责转发合法的网络信息,并对转发进行控制和登记. 在使用网络浏览器浏览网络信息的时候,如果使用代理服务器,浏览器就不是直接到web服务器中取回网页,而是向代理服务器发出请求,由代理服务器取回浏览器所需要的信息. 目前使用的因特网是一个典型的客户机/服务器结构,当用户的本地机与因特网连接时通过本地机的客户程序如浏览器或者软件下载工具发出请求,远端的服务器会在接收到请求之后提供

NAT技术与代理服务器

一.NAT技术介绍 1.概念 NAT英文全称是"Network Address Translation",中文意思是"网络地址转换",它是一个IETF(Internet Engineering Task Force, Internet工程任务组)标准,允许一个整体机构以一个公用IP(Internet Protocol)地址出现在Internet上.顾名思义,它是一种把内部私有网络地址(IP地址)转换成合法公有网络IP地址的技术,当在专用网内部的一些主机本来已经分配到

代理服务器

1.代理服务器是介于Internet和内网计算机之间的,其功能在于代替内网计算机去访问互联网信息.多台内网计算机可以通过同一外网IP访问Internet: 2.代理服务器的工作过程: (1)   客户端主机向代理服务器发送请求访问互联网: (2)   代理服务器在接收到请求后,先检查"来源地址"和"目的地址",如果符合,则进行下一步,否则,拒绝: (3)   代理服务器会先查找本地缓存,若存在查询数据,则直接返回给客户端主机,并结束本次处理:否则,进入下一步: (4

代理服务器笔记

1.代理服务器是介于Internet和内网计算机之间的,其功能在于代替内网计算机去访问互联网信息.多台内网计算机可以通过同一外网IP访问Internet: 2.代理服务器的工作过程: (1)   客户端主机向代理服务器发送请求访问互联网: (2)   代理服务器在接收到请求后,先检查"来源地址"和"目的地址",如果符合,则进行下一步,否则,拒绝: (3)   代理服务器会先查找本地缓存,若存在查询数据,则直接返回给客户端主机,并结束本次处理:否则,进入下一步: (4

用C#实现WEB代理服务器

用C#实现Web代理服务器 代理服务程序是一种广泛使用的网络应用程序.代理程序的种类非常多,根据协议不同可以分成HTTP代理服务程序.FTP代理服务程序等,而运行代理服务程序的服务器也就相应称为HTTP代理服务器和FTP代理服务器.本文将介绍的Web代理服务程序代理的是HTTP协议. 一.网络代理程序的优点 代理服务所起的是一个桥的作用,它是网络信息的中转站.在网络中应用代理服务一般是基于以下几个原因: (1)充分利用IP地址资源.在局域网中,一般对外的IP地址都是非常有限的,为了保证局域网内部

配置Squid代理服务器

1. 什么是squid Squid是一个支持HTTP.HTTPS.FTP等服务的缓存代理软件,它可以加快客户端网页浏览的速度,提高客户机的访问命中率,节省宝贵的带宽资源.squid不仅可以做正向代理,还可以利用反向代理技术提高网站访问性能,反向代理结合智能DNS解析就能实现一个最基本的CDN. 2. 搭建squid正向代理 正向代理一般用于企业内部访问外网,就是我们通常说的通过代理服务器上网,通过缓存页面数据可以节省带宽,提高上网速度. squid官方网站为 http://www.squid-c

代理服务器和NAT技术

一.代理服务器 所谓"代理",就是代而劳之的意思.代理服务器就是代理网络用户去取得网络信息,形象的说:它是网络信息的中转站,使得一个网络终端和另一个网络终端不直接进行相连,代理网络用户去取得信息.主要工作在OSI的会话层中. 一个完整的代理请求过程为:客户端首先与代理服务器创建连接,接着根据代理服务器所使用的代理协议,请求对目标服务器创建连接或者获得目标服务器的指定资源(如文件).在后一种情况中,代理服务器可能对目标服务器的资源下载至缓存,如果客户端索要获取的资源在代理服务器的缓存之中

squid 反向代理服务器

简介: Squid 反向代理常用于服务器端,客户端访问 Squid 代理服务器的 80 端口,Squid 代理服务器根据配置去请求后端的 web 服务器, 然后将请求到的信息保存在本地并回传给客户端,当又有客户端请求相同资源时,Squid 代理服务器直接将缓存中的信息回传给客户端. 一.安装 Squid shell > ulimit -n  # 默认打开文件描述符为 1024 ,要增大它 1024 shell > vim /etc/security/limits.conf * - nofile