MFC 与 HTTP编程

HTTP基本是现在应用的最为广泛的应用层协议了。其实本人也不是很懂, 当了两年程序员水平也相当的菜, 今天写这个呢,也是本着交流学习的目的,还望多多指教。。。。

其实大家对MFC有诸多非议, 特别是看到CString都有种想吐的冲动, 不过不要紧,且听我慢慢道来。


众所周知, MFC中对wininet进行了封装, 我们平时做HTTP主要使用三个类:
C/C++ code
    
    
    
    
CInternetSession CHttpConnection CHttpFile
下面我们来分析个HTTP头, 以baidu为例吧

C/C++ code
    
    
    
    
GET / s ? wd = CSDN & ch =& tn = maxthon2 & bar =& inputT = 2360 HTTP / 1.1 Accept: * /* Referer: http://www.baidu.com/ Accept-Language: zh-cn UA-CPU: x86 Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2) Host: www.baidu.com Connection: Keep-Alive Cookie: BAIDUID=299AE68AF13C37CFE541D72AD2695E87:FG=1; BDRCVFR[gztQtCol733]=aeXf-1x8UdYcs

UA-CPU 这个不懂, 不管它
GET 是HTTP指令,我就不说了。  
/s?wd=CSDN&ch=&tn=maxthon2&bar=&inputT=2360 这是要请求的资源
Accept: */* 可接收的文件类型, */* 就是所有类型了。
Referer: http://www.baidu.com/ 表示我来自哪个页面。

Accept-Encoding: gzip, deflate
Accept-Language: zh-cn   
这两个一般是一起用的, 表示让服务器发送压缩过的数据回来, 具体用的什么算法, 不懂。

User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2) 这是浏览器在告诉服务器:我是XXX
Host: www.baidu.com 这个是主机名
Connection: Keep-Alive TCP长连
Cookie: 这个参数一般用在需要验证的网站,很多人通过修改cookie来欺骗服务器。



好了, 转入正题:
0.抓包工具 用HTTPAnalyzerFullV5 只推荐这一个, 因为我只会用这个。。。

1. 超时设置, 因为MFC中的封装了不能设置超时(应该是可以设,但没有作用的),所以我一般是不管它的, 因为默认是十秒超时, 如果实在没办法, 就另开个线程, 用
WaitForSingleObject(event, timeout) 来判断是否超时。

2.HTTPS,这个其实一点也不神秘。。设置下参数就可以了
C/C++ code
    
    
    
    
#define NORMAL_CONNECT INTERNET_FLAG_KEEP_CONNECTION #define SECURE_CONNECT NORMAL_CONNECT | INTERNET_FLAG_SECURE #define NORMAL_REQUEST INTERNET_FLAG_RELOAD | INTERNET_FLAG_DONT_CACHE #define SECURE_REQUEST NORMAL_REQUEST | INTERNET_FLAG_SECURE

HTTPS用SECURE_REQUEST  

3 Agent, 有些服务器是禁止spider的 所以还是告诉它“我是IE”比较好

C/C++ code
    
    
    
    
#define IE_AGENT _T("Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; @MMZ4d.DeM_3+6~9=@nE2iuHyW-3XZ_fh]=t,-; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)")


4.Connection: Keep-Alive 建议去掉, 无端增加服务器压力是很不厚道的。

5.Cookie 这个参数一般人是不会管它的,但如果你想伪装的话就得拿它做些事情了。

首先要禁止MFC自动传入和传出Cookie.  
#define NORMAL_REQUEST INTERNET_FLAG_RELOAD | INTERNET_FLAG_DONT_CACHE | INTERNET_FLAG_NO_COOKIES

然后在发完请求后使用CHttpFile::QueryOption 来取服务器返回的cookie,它有个缺点就是取不到httpOnly的cookie

这里有点小麻烦, 因为很多人会说:哎呀, 我看到有HTTP-Only的Cookie怎么办啊
淡定....不要紧, 参考一下这篇文章: http://www.codeproject.com/KB/shell/RetrieveHttponlyCookies.aspx?msg=3889453#xx3889453xx 它这个使用的是延时加载DLL技术(看过window核心编程最后一章的朋友会心地笑了。。。)
不过比较蛋疼的是,使用这个类,必须把工程改成unicode的,不然会发生崩溃。

不会用就不要找我了。。

6。数字证书。 这个比较麻烦 ,总不能自己去加密吧。。。 不过也不要紧, 把Webbrowser嵌入到程序里,用它去过证书, 然后通过上面的hook技术把cookie拦截下来就是了。

7,Gzip 同样是为了减轻网络传输的压力。 就让服务器压缩下再传回来吧, 一般压缩率在60%-80%  
  发请求时,加入  
Accept-Encoding: gzip, deflate
Accept-Language: zh-cn   

在接收到以后, 自己解码。。。



好了,我知道的也就这么多, 大家不要喷啊,

最后奉上我自己的封装类, 支持HTTPS和GZIP(写的很烂,懒得改了)

http://download.csdn.net/source/3395305

你可能感兴趣的:(编程,windows,服务器,mfc,internet,WebBrowser)