MFC 与 HTTP编程

  • Post author:
  • Post category:其他


周末大放送——MFC 与 HTTP编程

不懂MFC的人可以走开了。。

不懂HTTP的也走开吧。。

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

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

众所周知, MFC中对wininet进行了封装, 我们平时做HTTP主要使用三个类:

下面我们来分析个HTTP头, 以baidu为例吧

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,这个其实一点也不神秘。。设置下参数就可以了

HTTPS用SECURE_REQUEST

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

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