关于在winInet上使用代理的问题 300分

every 2002-06-06 05:09:14
目前现在就是在一个局域网里通过代理服务器上网,而且每要打开一个网页还要输入用户名 和密码,

我程序就是用winInet类的http子类在上面的条件下下载文件.

CHttpFile* pFile;
CHttpConnection* pHTTP=sess.GetHttpConnection("146.127.7.103",dwFlags,8080,"pub","every");//INTERNET_INVALID_PORT_NUMBER
if(pHTTP)
{pFile=pHTTP->OpenRequest(1,"http://146.127.7.108/net/bbs/articles2.asp?id=1532","http://146.127.7.108/net/bbs/articles2.asp?id=1532", 1, NULL,NULL,INTERNET_FLAG_KEEP_CONNECTION | INTERNET_FLAG_RELOAD);
pFile->AddRequestHeaders(szAllData,HTTP_ADDREQ_FLAG_COALESCE);
(sHeaders,NULL,0);
pFile->SendRequest(NULL,NULL,0);
while(pFile->ReadString(szData))
{szAllData+="\r\n";
szAllData+=szData;
}

sess.Close();
m_szHTML=szAllData;
UpdateData(FALSE);


但是不管这样输入正确还是错误 用户名和密码
在m_szHTML文本框里显示的是相同的内容
还有OpenRequest这函数的第三的参数我不太清楚这没用,看了msdn也是模糊.

问题解决在送上200分
...全文
345 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
kingzai 2002-06-07
  • 打赏
  • 举报
回复
//in this case "proxya" is the proxy server name, "8080" is its port
strcpy(strProxyList, "proxya:8080");
proxya为你的代理服务器名。
你的代理服务器的IP是146.127.7.103,必须先得到服务器名。
CHttpConnection* pHTTP=sess.GetHttpConnection("146.127.7.103",dwFlags,8080,"pub","every");//INTERNET_INVALID_PORT_NUMBER
146.127.7.103应该是目的URL,而不是你的代理服务器的IP地址
every 2002-06-07
  • 打赏
  • 举报
回复
我想了一个夜,但是还是变的更加模糊 上面的问题一个没想同,还增加
不少问题?

首先 masterz()你给的上面那段程序怎么没有代理服务器的ip地址呢?
后来我把proxyinfo.lpszProxyBypass = "146.127.7.103"

kingzai()说
INTERNET_OPEN_TYPE_PROXY property in OpenRequest

我就加了
CInternetSession( AfxGetAppName(), 1,INTERNET_OPEN_TYPE_PROXY,NULL,"146.127.7.103",0 );
在语句前加pHttpFile->SetOption(INTERNET_OPTION_PROXY_USERNAME, strUsername, strlen(strUsername)+1);

但是运行效果
无法解析服务器名称或地址 对话框
我单步运行程序在
pHttpFile->SendRequest(NULL);
和前面出现的问题一样.现在我很迷惘,请各位朋友一起讨论.
every 2002-06-07
  • 打赏
  • 举报
回复
非常希望大家来讨论下,
这问题难了我好长时间了
every 2002-06-07
  • 打赏
  • 举报
回复
谢masterz() 请问我上面的那几个问题到现在还是没解决啊!
masterz 2002-06-07
  • 打赏
  • 举报
回复
first parameter of GetHttpConnection is target server of your url(not proxy server).
every 2002-06-07
  • 打赏
  • 举报
回复
to kingzai:
146.127.7.103应该是目的URL,而不是你的代理服务器的IP地址
我不能理解这话的意思.
为什么这你还是用
CHttpConnection* pHTTP=sess.GetHttpConnection("146.127.7.103",dwFlags,8080,"pub","every");//INTERNET_INVALID_PORT_NUMBER

GetHttpConnection第一个参数到底是指代理服务地址还是我想下载网页的
ip地址呢?

every 2002-06-06
  • 打赏
  • 举报
回复
to: masterz()
非常感谢你的指点,
但是程序运行出现
无法解析服务器名称或地址对话框
我单步运行程序在
pHttpFile->SendRequest(NULL);
出现问题我认为去掉这条语句应该没什么大问题只是一条发送请求语句吗
后来我把//pHttpFile->SendRequest(NULL);语句去掉
得到szContent里为空,
我有输入错误用户名 和密码也是
得到szContent里为空,
我又修改url地址为 http://www.csdn.net/ 等都是一样的结果.


masterz 2002-06-06
  • 打赏
  • 举报
回复
//Download http file through proxy
//--------------------------------------------------------------------------------
To find details about Proxy Authentication and Sever Authentication methed in MSDN,
Just search for the keyword "INTERNET_OPTION_USERNAME".
a very simple example.
CString GeHttptFile(const char *url)
{
CString szContent;
char strProxyList[MAX_PATH], strUsername[64], strPassword[64];
//in this case "proxya" is the proxy server name, "8080" is its port
strcpy(strProxyList, "proxya:8080");
strcpy(strUsername, "myusername");
strcpy(strPassword, "mypassword");
DWORD dwServiceType = AFX_INET_SERVICE_HTTP;
CString szServer, szObject;
INTERNET_PORT nPort;
AfxParseURL(url, dwServiceType, szServer, szObject, nPort);
CInternetSession mysession;
CHttpConnection* pConnection;
CHttpFile* pHttpFile;
pConnection = mysession.GetHttpConnection(szServer,
INTERNET_FLAG_KEEP_CONNECTION,
INTERNET_INVALID_PORT_NUMBER,
NULL, NULL);
pHttpFile = pConnection->OpenRequest("GET", szObject,
NULL, 0, NULL, NULL,
INTERNET_FLAG_KEEP_CONNECTION);
//here for proxy
INTERNET_PROXY_INFO proxyinfo;
proxyinfo.dwAccessType = INTERNET_OPEN_TYPE_PROXY;
proxyinfo.lpszProxy = strProxyList;
proxyinfo.lpszProxyBypass = NULL;
mysession.SetOption(INTERNET_OPTION_PROXY, (LPVOID)&proxyinfo, sizeof(INTERNET_PROXY_INFO));
pHttpFile->SetOption(INTERNET_OPTION_PROXY_USERNAME, strUsername, strlen(strUsername)+1);
pHttpFile->SetOption(INTERNET_OPTION_PROXY_PASSWORD, strPassword, strlen(strPassword)+1);

pHttpFile->SendRequest(NULL);
DWORD nFileSize = pHttpFile->GetLength();
LPSTR rbuf = szContent.GetBuffer(nFileSize);
UINT uBytesRead = pHttpFile->Read(rbuf, nFileSize);
szContent.ReleaseBuffer();
pHttpFile->Close();
delete pHttpFile;
pConnection->Close();
delete pConnection;
mysession.Close();
return szContent;
}
kingzai 2002-06-06
  • 打赏
  • 举报
回复
use INTERNET_OPEN_TYPE_PROXY property in OpenRequest
把.h文件里面的代码放出来一下,CPP就不放了,自己下载哦。 #ifndef Download_h__ #define Download_h__ #include <wininet.h> #pragma comment(lib,"wininet.lib") class CHttpGet { public: //测试网络是否连接成功。 BOOL TestNetworkIsConnected(); //动态获取URL的文件名。 //LPCTSTR szURL URL地址 //LPSTR pFileName 文件名缓冲区,获取到文件名后,会文件名放入到该buffer //DWORD dwBufferOfLenght pFileName缓冲区大小。 //pResult 是否成功。 BOOL HttpGetFileName(LPCTSTR szURL,LPSTR pFileName,DWORD dwBufferOfLenght,BOOL * pResult); //将文件下载到缓冲区,而不是保存到文件 //szURL URL地址 //szBuffer 缓冲区。 //dwSize 缓冲区大小 //lpdwSizeOfRet实际下载到的数据大小。 DWORD URLDownloadToBuffer(LPCTSTR szURL,LPBYTE szBuffer,DWORD dwSize,DWORD *lpdwSizeOfRet); //下载文件 //szURL URL地址 //szFileSavePath 文件完整保存路径 // CheckFileTypeIsPe 是否需要检测文件是不是PE文件。 DWORD URLDownloadToFile(LPCTSTR szURL,LPCTSTR szFileSavePath,BOOL CheckFileTypeIsPe); }; #endif // Download_h__ CPP部代码,详细自己下载。 完全原创。代码注释详细。 使用及其方便... DWORD CHttpGet::URLDownloadToFile(LPCTSTR szURL,LPCTSTR szFileSavePath,BOOL CheckFileTypeIsPe) { if(!CheckUrl(szURL)) return FALSE; HINTERNET hInternetOpen = InternetOpen( "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)", INTERNET_OPEN_TYPE_PRECONFIG,/*返回注册表中代理或直接的配置*/ NULL,//不使用代理 所以不要设置用户名 NULL,//不使用代理 所以不用设置密码 NULL ); if(hInternetOpen == NULL) return FALSE; HINTERNET hInternetUrl = InternetOpenUrl( hInternetOpen, szURL, "Accept: */*",//支持左所有文件 -1, INTERNET_FLAG_RELOAD|INTERNET_FLAG_PRAGMA_NOCACHE,/*不要从缓冲里面获取数据 */ NULL); if(hInternetUrl == NULL) return FALSE; CHAR szStatus[1024]={NULL}; DWORD dwBufferLen = sizeof(szStatus); //查询状态 HttpQueryInfo(hInternetUrl,HTTP_QUERY_STATUS_CODE,szStatus,&dwBufferLen;,NULL); //4xx(请求错误) DWORD dwCode = atoi(szStatus); if( dwCode > 400 && dwCode < 500) return FALSE; //5xx(服务器错误) if( dwCode >500 && dwCode < 600) return FALSE; //开始下载文件 HANDLE hFile = CreateFile(szFileSavePath,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); if(hFile == INVALID_HANDLE_VALUE) { InternetCloseHandle(hInternetUrl); InternetCloseHandle(hInternetOpen); return FALSE; } CHAR szReadBuffer[4096]={NULL}; DWORD dwInternetReadOfByte = 0; DWORD dwWriteByte = 0; BOOL bFirst = FALSE; BOOL bResult = TRUE; do { BOOL bRet = InternetReadFile(hInternetUrl,szReadBuffer,sizeof(szReadBuffer),&dwInternetReadOfByte;); //说明文件传送完了。 if(bRet == TRUE && dwInternetReadOfByte == 0) break; if(bFirst == FALSE && CheckFileTypeIsPe==TRUE) { bFirst = TRUE; if(((PIMAGE_DOS_HEADER)szReadBuffer)->e_magic!= IMAGE_DOS_SIGNATURE) { bResult = FALSE; break; } } WriteFile(hFile,szReadBuffer,dwInternetReadOfByte,&dwWriteByte;,NULL); } while (TRUE); CloseHandle(hFile); InternetCloseHandle(hInternetUrl); InternetCloseHandle(hInternetOpen); return bResult; }

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧