1, 要求
项目客户端需要在程序中进行登录和退出web页。
2, 资料
一个Windows http类CAmHttpSocket。(简单实用)
3, 详细设计
1, 了解如何使用CAmHttpSocket类
1, 定义类的对象CAmHttpSocket http;
2, 主要的调用函数:
GetPage(const TCHAR *url,
bool Post,
const char *PostData,
int PostDataLength);
3,CAmHttpSocket类已经封装了http头,我们只需要去填充自己的数据。
2, 了解网页是如何登录与退出
利用抓包工具Wireshark抓取登录和退出网页的数据报。
1, 登录数据报分析
POST /voyager/index.php?action=check-login HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/msword, application/x-silverlight, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/QVOD, */*
Referer:
Accept-Language: zh-cn
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; GTB6; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 2.0.50727)
Host: 192.168.1.31
Content-Length: 51
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: PHPSESSID=bf9mtkkec4iqjutltg0ipr1vf1
username=admin&pswd=123&login=%E7%99%BB+%E9%99%86.
通过数据报分析POST 的真正有用的用户数据为username=admin&pswd=123,所以分析出登录所用的参数值为
url: ;
PostData : username=admin&pswd=123;
2, 退出数据报分析
POST /voyager/index.php?action=logout HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/msword, application/x-silverlight, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/QVOD, */*
Referer:
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; GTB6; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 2.0.50727)
Host: 192.168.1.31
Connection: Keep-Alive
Cookie: PHPSESSID=bf9mtkkec4iqjutltg0ipr1vf1
通过数据报分析退出没有用户数据,所以分析出退出所用的参数值为
url: ;
post:true;(测试发现如果是FALSE,即发送GET 消息,没有退出,只有发送POST消息才会退出)
3, https的问题
WinInet 应用程序中此错误不安装证书。 可以使用两种方法是处理此错误。 使用类似于以下代码。
方法 1。 与 UI (生成一个消息框类似于 InternetExplorer):
... Again: if (!HttpSendRequest (hReq,...)) dwError = GetLastError (); if (dwError == ERROR_INTERNET_INVALID_CA) { // Make sure to check return code from InternetErrorDlg // user may click either OK or Cancel. In case of Cancel // request should not be resumbitted. InternetErrorDlg (GetDesktopWindow(), hReq, ERROR_INTERNET_INVALID_CA, FLAGS_ERROR_UI_FILTER_FOR_ERRORS | FLAGS_ERROR_UI_FLAGS_GENERATE_DATA | FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS, NULL); goto again; }
方法 2。 没有 UI:
Again: if (!HttpSendRequest (hReq,...)) dwError = GetLastError (); if (dwError == ERROR_INTERNET_INVALID_CA) { DWORD dwFlags; DWORD dwBuffLen = sizeof(dwFlags); InternetQueryOption (hReq, INTERNET_OPTION_SECURITY_FLAGS, (LPVOID)&dwFlags, &dwBuffLen); dwFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA; InternetSetOption (hReq, INTERNET_OPTION_SECURITY_FLAGS, &dwFlags, sizeof (dwFlags) ); goto again; } ...
使用 MFCWinInet 类使用类似的逻辑。
4, 以上只是正对要求的简单实现,实际上还有好多处理需要去做,源码见附件
|
文件: |
LoginWeb.rar |
大小: |
14KB |
下载: |
下载 | |
5,修改更新为通用版本
由于项目是在Unicode环境下,发现以前版本,不能在unicode下使用。
1,建立Unicode版本
菜单【Build】->【configuration】,点击button【Add】添加“Unicode Debug”,点击【OK】,成功建立Unicode debug版本,最后还要到 菜单【Project】->【Project Settings】,在
【Settings For】中选中 Win32 Unicode Debug, 选中【C/C++】,在【Category】项目中选择“General” ,在【Proprocessor definitions】中添加“,UNICODE,_UNICODE”即可。
2,编译出现错误
msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol
解决办法
通常, MFC项目的程序入口函数是WinMain, 如果编译项目的Unicode版本, 程序入口必须改为wWinMainCRTStartup, 所以需要重新设置程序入口:
[Project] --> [Settings] --> 选择"Link"属性页,
在Category中选择Output,
再在Entry-point symbol中填入wWinMainCRTStartup, 即可
3,ANSI和Unicode的问题
4,在编译通过后链接测试
发现POST数据只有原来的一般,当把HttpSendRequest的参数5乘以2,发现数据发送完整,但是网页服务器没有响应,由于在ANSI的情况下是成功的,所以我决定把宽字符转为字符,最后终于成功。
#ifdef UNICODE
size_t len = wcstombs(tmpPostData, PostData, PostDataLength);
#else
size_t len = PostDataLength;
memcpy(tmpPostData,PostData,PostDataLength);
#endif
again: if(!HttpSendRequest(hIS, headers, _tcslen(headers), (char *)tmpPostData, len))
6,最新修改见附件
|
文件: |
LoginWeb20090414.rar |
大小: |
14KB |
下载: |
下载 | |
阅读(6542) | 评论(0) | 转发(0) |