您的位置:首页 > 其它

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

2009-06-17 09:51 148 查看
好久没有更新了,忙呀!

最近在一个项目的实施过程中,发现使用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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: