MFC 与 HTTP编程
2011-06-28 11:11
183 查看
周末大放送——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
不懂MFC的人可以走开了。。
不懂HTTP的也走开吧。。
HTTP基本是现在应用的最为广泛的应用层协议了。其实本人也不是很懂, 当了两年程序员水平也相当的菜, 今天写这个呢,也是本着交流学习的目的,还望多多指教。。。。
其实大家对MFC有诸多非议, 特别是看到CString都有种想吐的冲动, 不过不要紧,且听我慢慢道来。
众所周知, MFC中对wininet进行了封装, 我们平时做HTTP主要使用三个类:
CInternetSession CHttpConnection CHttpFile
下面我们来分析个HTTP头, 以baidu为例吧
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,这个其实一点也不神秘。。设置下参数就可以了
#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”比较好
#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
相关文章推荐
- MFC 与 HTTP编程
- MFC之HTTP协议编程
- MFC中使用ADO进行数据库操作 参考FROM:http://hi.baidu.com/sunkanghome/item/e1fda510b3186359f1090ee2 数据库与数据库编程: 当
- VS2010/MFC编程入门之二十三(常用控件:按钮控件的编程实例)
- HttpWebRequest编程相关问题(2)
- 推荐一个网站:编程资料网 http://www.ourdev.net/
- 用&a 4000 mp;nbsp;MFC 类库编程实现工作者线程
- 学习笔记:MFC实现http协议传输图片和文本
- 以前实习期间写的一段mfc编程,对数据库和xml格式文档的相关操作 主要相关代码 之四 读取xml格式文档到界面
- 直接使用默认设置进行打印:(2)使用MFC编程实现打印中文字符串
- MFC 对话框编程 总结
- 学习笔记:MFC实现http协议传输图片和文本
- 多线程编程之二——MFC中的多线程开发
- 聊聊Socket、TCP/IP、HTTP、FTP及网络编程 未完
- MFC使用HttpGet和HttpPost方法与服务器通信
- Windows Phone 7 网络编程之webclient和httpwebrequest的使用
- VS2010/MFC编程入门之三(VS2010应用程序工程中文件的组成结构)
- VS2008MFC编程资源视图的Dialog测试按钮在哪里?
- HttpWebRequest编程相关问题阶段总结
- MFC对话框编程之控件删除