Chinaunix首页 | 论坛 | 博客
  • 博客访问: 63021
  • 博文数量: 15
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 220
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-04 13:37
文章分类

全部博文(15)

文章存档

2011年(1)

2009年(14)

我的朋友

分类: WINDOWS

2009-04-13 16:58:57

1, 要求
项目客户端需要在程序中进行登录和退出web页。
2, 资料
一个Windows httpCAmHttpSocket。(简单实用)
3,   详细设计
1,   了解如何使用CAmHttpSocket
1,   定义类的对象CAmHttpSocket http;
2,   主要的调用函数:
             GetPage(const TCHAR *url,
 bool  Post,
const  char *PostData,
 int   PostDataLength)
          3CAmHttpSocket类已经封装了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的问题
在测试过程中发现 https不能登录成功,跟踪函数HttpSendRequest发现返回错误码为12045,查阅MSDN资料,原来是“WinInet 无效证书颁发机构错误”,具体的解决办法:(网页链接:http://www.zhiaopc.com/blog/post/316.htm
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) |
给主人留下些什么吧!~~