InternetOpen使用socks代理(需要帐号密码验证的代理)

时间:2010年05月06日 点击:2728

1.  相关函数: 

  1. HINTERNET  WINAPI  InternetOpen(    
  2. LPCTSTR  lpszAgent,      
  3. DWORD  dwAccessType,      
  4. LPCTSTR  lpszProxy,      
  5. LPCTSTR  lpszProxyBypass,      
  6. DWORD  dwFlags);    
  7.  
  8. BOOL  WINAPI  InternetSetOption(    
  9. HINTERNET  hInternet,      
  10. DWORD  dwOption,      
  11. LPVOID  lpBuffer,      
  12. DWORD  dwBufferLength);   

2.  相关结构 

  1. typedef  struct  {    
  2. DWORD  dwAccessType;    
  3. LPCTSTR  lpszProxy;    
  4. LPCTSTR  lpszProxyBypass;    
  5. }  INTERNET_PROXY_INFO,  *LPINTERNET_PROXY_INFO;   

3.  使用代理服务器 

(1)请将dwAccessType设置成INTERNET_OPEN_TYPE_PROXY 
(2)设置lpszProxy 
(a)代理的格式必须为:[<protocol>=][<scheme>://]<proxy>[:<port>]. 
(b)其中protocol,  scheme://,  :port是可选项,  如果忽略这三者,  则它们默认分别为 
HTTP,  HTTP://,  :80.  即默认为HTTP代理. 
(c)多个代理必须使用"  "(空格)隔开 
(d)各种常用代理的使用见如下: 

HTTP: 
HTTP=HTTP://proxyserver:port 

FTP: 
FTP:FTP://proxyserver:port 

GOPHER 
GOPHER=HTTP://proxyserver:port 

SOCKS=proxyserver:port 

其中前三种都可以在msdn中找到,  但第四种我可是找了N多地方才好不容易找到了.  另外要注意,  msdn中明确说明只有安装了IE才能使用SOCKS代理. 

么区分SOCK4/SOCK5代理?    SOCK5代理一般还需要身份认证的.  
 

  1. /*The  following  example  code  shows  how  authentication 
  2.  could  be  handled  using  InternetSetOption.  */  
  3.  
  4. HINTERNET  hOpenHandle,    hResourceHandle;    
  5. DWORD  dwError,  dwStatus;    
  6. DWORD  dwStatusSize  =  sizeof(dwStatus);    
  7. char  strUsername[64],  strPassword[64];    
  8.  
  9. hOpenHandle  =  InternetOpen("Example",      
  10. INTERNET_OPEN_TYPE_PRECONFIG,      
  11. NULL,  NULL,  0);    
  12.  
  13. hConnectHandle  =  InternetConnect(hOpenHandle,      
  14. "www.server.com",      
  15. INTERNET_INVALID_PORT_NUMBER,      
  16. NULL,    
  17. NULL,      
  18. INTERNET_SERVICE_HTTP,    
  19. 0,0);    
  20.  
  21. hResourceHandle  =  HttpOpenRequest(hConnectHandle,  "GET"
  22.  "/premium/default.htm",  NULL,  NULL,    
  23. NULL, INTERNET_FLAG_KEEP_CONNECTION, 0);    
  24.  
  25. resend:    
  26. HttpSendRequest(hResourceHandle,  NULL,  0,  NULL,  0);    
  27. HttpQueryInfo(hResourceHandle,  HTTP_QUERY_FLAG_NUMBER    &brvbar      
  28. HTTP_QUERY_STATUS_CODE,  &dwStatus,  &dwStatusSize,  NULL);    
  29.  
  30. switch  (dwStatus)    
  31. {    
  32. case  HTTP_STATUS_PROXY_AUTH_REQ:  //  Proxy  Authentication  Required    
  33. //  Insert  code  to  set  strUsername  and  strPassword.    
  34. //  cchUserLength  is  the  length  of  strUsername  and      
  35. //  cchPasswordLength  is  the  length  of  strPassword.    
  36. DWORD  cchUserLength,  cchPasswordLength;    
  37. //  Insert  code  to  safely  determine  cchUserLength  and    
  38. //  cchPasswordLength.  Insert  appropriate  error  handling  code.    
  39. InternetSetOption(hResourceHandle,      
  40. INTERNET_OPTION_PROXY_USERNAME,      
  41. strUsername,      
  42. cchUserLength+1);    
  43.  
  44. InternetSetOption(hResourceHandle,      
  45. INTERNET_OPTION_PROXY_PASSWORD,      
  46. strPassword,      
  47. cchPasswordLength+1);    
  48. goto  resend;    
  49. break;    
  50. case  HTTP_STATUS_DENIED:          //  Server  Authentication  Required.    
  51. //  Insert  code  to  set  strUsername  and  strPassword.    
  52. //  cchUserLength  is  the  length  of  strUsername  and      
  53. //  cchPasswordLength  is  the  length  of  strPassword.    
  54. DWORD  cchUserLength,  cchPasswordLength;    
  55. //  Insert  code  to  safely  determine  cchUserLength  and      
  56. //  cchPasswordLength.  Insert  error  handling  code  as      
  57. //  appropriate.    
  58.  
  59. InternetSetOption(hResourceHandle,  INTERNET_OPTION_USERNAME,    
  60. strUsername,  cchUserLength+1);    
  61. InternetSetOption(hResourceHandle,  INTERNET_OPTION_PASSWORD,    
  62. strPassword,  cchPasswordLength+1);    
  63. goto  resend;    
  64. break;    
  65. }    
  66.  
  67. //  Insert  code  to  read  the  data  from  the  hResourceHandle    
  68. //  at  this  point.   

这段代码就是设置代理的用户名和密码的呀,  其中INTERNET_OPTION_USERNAME设置代理服务器的用户名,  INTERNET_OPTION_PASSWORD设置相应的密码. 
删繁就简,  如果只是纯粹的设置用户名和密码,  只需要下面的代码就可以了. 

InternetSetOption(hResourceHandle,  INTERNET_OPTION_USERNAME, 
strUsername,  cchUserLength+1); 
InternetSetOption(hResourceHandle,  INTERNET_OPTION_PASSWORD, 
strPassword,  cchPasswordLength+1); 

其中strUsername设置用户名,  strPassword指定密码. 
详细说明请见msdn: 
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wininet/wininet/handling_authentication.asp

 

赞助商链接

热门内容

相关内容

联系我们

联系方式