转载 WinInet库接口穿越代理服务器(转)

来源:互联网 发布:java jsonnode 遍历 编辑:程序博客网 时间:2024/06/07 22:37

转载 WinInet库接口穿越代理服务器(转)收藏

好久没有更新了,忙呀!

最近在一个项目的实施过程中,发现使用socket不能穿越需要认证的代理服务器的情况,调用WinInet库函数可以实现。

简单说说如下
(1)使用socket可以穿越不需要用户认证的代理服务器,向应用服务器发送get、post请求
  过程:
   <1>向代理服务器建立socket连接
   <2>connect成功后,发送“CONNECT IP:port HTTP/1.0/r/nUser-Agent:MyApp/0.1/r/n/r/n”HTTP协议串到代理服务器
    -》IP:port为目标服务器(可能为应用服务器的80端口,也可以是某一个外网进程的监听端口)的IP地址和端口号
   <3>接收应答,如果接收到的串中含“200 OK”时,表示通过代理建立通道成功;否则,建立通道失败
    -》失败的原因可能是目标服务器不可达(IP、port号不对,或没有监听好)或代理服务器需要认证
(2)对于需要用户认证的代理服务器,调用WinInet库接口可以完成
 CString srvName, srvPort;
 char accepted[1024];
    
 hSession = InternetOpen("wininet examples",INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
 if(!hSession){
  MessageBox("InternetOpen error", "Err", MB_OK);
  return;
 }

 //如果明确知道需要认证,第4,5个参数可以输入用户名,密码"administrator","password"
 //第2,3个参数为目标主机IP、端口号
 hConnect = InternetConnect(hSession,serverName,port,NULL,NULL,INTERNET_SERVICE_HTTP,INTERNET_FLAG_RELOAD,1);
 if(!hConnect){
  MessageBox("InternetConnect error", "Err", MB_OK);
  return;
 }

 hRequest = HttpOpenRequest(hConnect,"GET","index.html",NULL,NULL,NULL,0,0);
 if (!hRequest){
  MessageBox("HttpOpenRequest error", "Err", MB_OK);
  return;
 }


 CString sndStr;
 GetDlgItem(IDC_ToSend)->GetWindowText(sndStr);

resend:

 //发送请求
 retCode = HttpSendRequest(hRequest,NULL,0,sndStr.GetBuffer(),sndStr.GetLength());

 ////显示对话窗口
 if(!retCode)
 {
  dwErrorCode = GetLastError();

  dwError = InternetErrorDlg((HWND )GetActiveWindow(), hRequest, dwErrorCode,
          FLAGS_ERROR_UI_FILTER_FOR_ERRORS |
          FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS |
          FLAGS_ERROR_UI_FLAGS_GENERATE_DATA,
          NULL);

  if (dwError == ERROR_INTERNET_FORCE_RETRY)
   goto resend;
 }
 /////////////////////////////////弹出网络密码对话框
 else
 {
  TCHAR status[32];
  DWORD tSize = 32;
  long code;
  if(HttpQueryInfo(hRequest, HTTP_QUERY_STATUS_CODE, status, &tSize,NULL))
  {
   //OK
   code = _ttol(status);
   if(code == HTTP_STATUS_PROXY_AUTH_REQ || code == HTTP_STATUS_DENIED)
   {
    retCode = InternetReadFile(hRequest,accepted,sizeof(accepted)-1,&readCount);
    if(readCount!=0)
     dwError = InternetErrorDlg((HWND)GetActiveWindow(), hRequest, dwErrorCode,
     FLAGS_ERROR_UI_FILTER_FOR_ERRORS |
     FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS |
     FLAGS_ERROR_UI_FLAGS_GENERATE_DATA,
     NULL);

    if (dwError == ERROR_INTERNET_FORCE_RETRY)
     goto resend;
   }
  }
  else
  {
   //ERR
  }
 }
 //////////////////////////////弹出网络密码对话框

 if(!retCode) {

  CString errStr("GetLastError=");

  memset(err_c, 0, sizeof(err_c));
  itoa(GetLastError(), err_c, 10);

  errStr += err_c;

  MessageBox(errStr.GetBuffer(), "send data error", MB_OK);
 }


 //接收请求
 readCount=0;
 retCode = InternetReadFile(hRequest,accepted,sizeof(accepted)-1,&readCount);
 if(retCode) {
  if(readCount>0)
   accepted[readCount]=0;

  //printf("%s/n",accepted);
  GetDlgItem(IDC_Recived)->SetWindowText(accepted);

 } else {
  CString errStr("GetLastError=");

  memset(err_c, 0, sizeof(err_c));
  itoa(GetLastError(), err_c, 10);
  errStr += err_c;

  MessageBox(errStr.GetBuffer(), "read response error", MB_OK);
 }    
 
 //////////////////////////////////////////////
 如果,srvName, srvPort分别为www.baidu.com和80
 则收到的数据,应该为以下内容
 <html><head><meta http-equiv=Content-Type content="text/html;charset=gb2312"><title>°ù?èò???£????í?aμà      </title><style>body{margin:4px 0}p{margin:0;padding:0}img{border:0}td,p,#u{font-size:12px}#b,#u,#l td,a{font-family:arial}#kw{font:16px Verdana;height:1.78em;padding-top:2px}#b{height:30px;padding-top:4px}#b,#b a{color:#77c;font-size:12px}#u{padding-right:10px;line-height:19px;text-align:right;margin-bottom:3px !important;margin-bottom:10px}#sb{height:2em;width:5.6em}#km{height:50px}#km a{font-family:??ì?}#l{margin-bottom:5px}#m{margin-left:100px;width:22.1em;text-align:center}p,#b,table{width:600px;border:0}#sb,#km,#l,#m{font-size:14px}#m a,#m b{margin-right:1.14em}a{color:#00c}a:active{color:#f60}</style></head>
<body><div id=u></div><center><a href=http://hi.baidu.com/baidu _fcksavedurl="http://hi.baidu.com/baidu" target=_blank><img src=http://www.baidu.com/img/logo.gif width=174 height=59 alt="μ?′???è? °ù?è????"></a><br><br><br><br><table cellpadding=0 cellspacing=0 id=l><tr><td align=left><div id=m><a onclick=s(this) href=http://news.bai
 //////////////////////////////////////////////


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/pony12/archive/2007/11/29/1906919.aspx

 

http://blog.csdn.net/abcpanpeng/archive/2009/06/17/4275386.aspx

 

原创粉丝点击