zoukankan      html  css  js  c++  java
  • VC POST表单——登录验证新浪邮箱

    1、本机环境:

         Windows XP SP3、ADSL

     

    2、开发工具:

         WildPackets OmniPeek V5.1.4

         Visual C++ 6.0

         IE6.0

         FlexEdit V2.3.1871

     

         如果觉得OmniPeek文件太大不方面下载的朋友,可以使用开源的简易抓包分析工具,先登录codeproject,再单击此处开始下载或邮件给我索取源码 (ningyusky@tom.com 或 koma0769@vip.qq.com

     

         注意:如果没有登录codeproject的话是无法下载的,你可以自行修改该工具源码,将每一步GET、POST等动作的数据全部记录于某文件,以便查看分析之.....

     

         我就是如此,因为我的硬件配置不是很“主流”的,所以每次OmniPeek启动和新建工程时,电脑都快要死机.....

     

    3、程序运行效果:

     

    sina mail login

     

    4、源码说明:

     

    虽如此短短一百余行的代码,但我在debug下调试了三个多小时才解决了这里每一处存在或可能存在的错误,希望可以与大家交流共同探讨......

     

    1. /************************************************************************/          
    2. /* 函数说明:模拟POST表单——登录新浪邮箱                                            
    3. /* 参    数:无                                        
    4. /* 返 回 值:无        
    5. /* By:Koma   2009.10.16 10:18 
    6. /************************************************************************/     
    7. void CSinaDlg::OnOK()   
    8. {  
    9.     // TODO: Add extra validation here  
    10.     UpdateData(TRUE);  
    11.     if(m_strUser.IsEmpty()){  
    12.         MessageBox("邮箱用户名不能为空","提示");  
    13.         m_ctrUser.SetFocus();  
    14.         return;  
    15.     }  
    16.   
    17.     if(m_strUser.Find("@sina") < 1){  
    18.         MessageBox("请先添加邮箱名的后缀,如@sina...","提示");  
    19.         m_ctrUser.SetFocus();  
    20.         return;  
    21.     }  
    22.       
    23.     if(m_strPassword.IsEmpty()){  
    24.         MessageBox("邮箱密码不能为空","提示");  
    25.         m_ctrUser.SetFocus();  
    26.         return;  
    27.     }  
    28.   
    29.     char    szAccept[]   = "Accept: */*";  
    30.     char    szReferer[]  = "Referer: http://mail.sina.com.cn//r/n";  
    31.     CString szFormData   = "domain=sina.cn&logintype=uid&u="+ m_strUser +"&domain=sina.com&psw="+ m_strPassword +"&btnloginfr";  
    32.   
    33.     HINTERNET   hSession;     
    34.     HINTERNET   hConnect;     
    35.     HINTERNET   hRequest;     
    36.     BOOL        bReturn  = FALSE;  
    37.       
    38.     // 之前使用Socket,现在使用Wininet相关API建立链接  
    39.     hSession = InternetOpen("InetAll",INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);  
    40.     hConnect = InternetConnect(hSession,"mail.sina.com.cn",INTERNET_DEFAULT_HTTP_PORT,NULL,NULL,INTERNET_SERVICE_HTTP,0,1);  
    41.     hRequest = HttpOpenRequest(hConnect,"POST","cgi-bin/login.cgi",NULL,"http://www.sina.com.cn",(LPCSTR *)&szAccept,INTERNET_FLAG_RELOAD,1);  
    42.   
    43.     // 提交数据表单  
    44.     LPVOID pBuf = (LPVOID)szFormData.GetBuffer(szFormData.GetLength());  
    45.     bReturn = HttpSendRequest(hRequest,"Content-Type: application/x-www-form-urlencoded/r/n",-1,pBuf,szFormData.GetLength());  
    46.     if(!bReturn)  
    47.     {  
    48.         MessageBox("发送Http请求失败!","提示",MB_ICONERROR | MB_OK);  
    49.         return;  
    50.     }  
    51.   
    52.     char    szRecvBuf[1024];        // 接受数据缓冲区  
    53.     DWORD   dwNumberOfBytesRead;    // 服务器返回大小  
    54.     DWORD   dwRecvTotalSize=0;      // 接受数据总大小  
    55.     DWORD   dwRecvBuffSize=0;       // 接受数据buf的大小  
    56.     CFile   m_File;                 // 将返回数据写入文件  
    57.     CString strTemp;                // 临时消息框  
    58.   
    59.     m_File.Open("RecvData.tmp",CFile::modeWrite | CFile::modeCreate,NULL);  
    60.     memset(szRecvBuf,0,1024);  
    61.   
    62.     do  
    63.     {     
    64.         // 开始读取数据  
    65.         bReturn = InternetReadFile(hRequest,szRecvBuf,1024,&dwNumberOfBytesRead);  
    66.         if(!bReturn)  
    67.         {  
    68.             MessageBox("InternetReadFile Error !","提示",MB_ICONERROR | MB_OK);  
    69.             break;  
    70.         }  
    71.   
    72.         // 统计接受数据的大小  
    73.         szRecvBuf[dwNumberOfBytesRead] = '/0';  
    74.         dwRecvTotalSize += dwNumberOfBytesRead;  
    75.         dwRecvBuffSize  += strlen(szRecvBuf);  
    76.   
    77.         // 将缓冲区写入文件  
    78.         m_File.Write(szRecvBuf,strlen(szRecvBuf));  
    79.         m_File.Flush();  
    80.     } while(dwNumberOfBytesRead !=0);  
    81.   
    82.     // 检查接受到的数据包是否完整  
    83.     m_File.Close();  
    84.     if(dwRecvTotalSize != dwRecvBuffSize)  
    85.     {  
    86.         MessageBox("接受数据时丢包,返回大小不一致!");  
    87.         return ;  
    88.     }  
    89.   
    90.     CString     str="";             // 全部内容  
    91.     CString     strLine="";         // 单行内容  
    92.     CStdioFile  file;               // 文件对象  
    93.     if(!file.Open("RecvData.tmp",CFile::modeRead | CFile::typeText,NULL))        
    94.     {        
    95.         CString strTemp;  
    96.         strTemp.Format("Open file error:%d",GetLastError());  
    97.         MessageBox(strTemp);  
    98.         return;        
    99.     }        
    100.       
    101.     // 按行读取tmp全部内容  
    102.     while(file.ReadString(strLine))  
    103.     {        
    104.         str = str + strLine;  
    105.     }  
    106.     file.Close();  
    107.     wchar_t*    pWChar = NULL;  
    108.     DWORD       nLen1;  
    109.   
    110.     // 将新浪网页UTF-8格式编码转换成Unicode  
    111.     nLen1   = MultiByteToWideChar(CP_UTF8,0,str,str.GetLength(),pWChar,0);  
    112.     pWChar  = new wchar_t[nLen1 + 1];  
    113.     memset(pWChar,0,(nLen1 + 1 ) * sizeof(wchar_t));  
    114.     MultiByteToWideChar(CP_UTF8,0,str,str.GetLength(),pWChar,nLen1);  
    115.       
    116.     char*   pChar = NULL;  
    117.     DWORD   nLen2;  
    118.   
    119.     nLen2 = WideCharToMultiByte(CP_ACP,0,pWChar,nLen1,pChar,0,NULL,NULL);   
    120.     pChar = new char[nLen2 + 1];  
    121.     memset(pChar,0, nLen2 + 1);  
    122.     WideCharToMultiByte(CP_ACP,0,pWChar,nLen1,pChar,nLen2,NULL,NULL);  
    123.   
    124.     // 查找登录时服务器时返回的信息  
    125.     str.Format("%s",pChar);  
    126.     if(str.Find("安全退出",0)>=1)  
    127.     {  
    128.         MessageBox("邮箱登录成功!","提示");  
    129.         m_ctrUser.SetFocus();  
    130.     }  
    131.     else  
    132.     {  
    133.         MessageBox("邮箱登录失败!","提示",MB_ICONERROR | MB_OK);  
    134.         m_ctrUser.SetFocus();  
    135.     }  
    136.   
    137.     // 删除临时文件、释放内存  
    138.     DeleteFile("RecvData.tmp");  
    139.     delete pChar;  
    140.     delete pWChar;   
    141. }  

     

     5、源码下载地址

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

  • 相关阅读:
    【星云测试】Wings-面向企业级的单元测试用例自动编码引擎最新发布
    【星云测试】Wings企业级单元测试自动编码引擎白皮书
    Redis基础之命令篇
    Redis安装与启动
    My Self Introduction
    这就是小学生也会用的四则计算练习APP吗?- by软工结对编程项目作业
    Java余弦计算文本相似度项目—第一次个人编程作业(软件工程)
    Android 开发学习进程0.26 fragment的工厂实例化
    Android 开发学习进程0.25 自定义控件
    Android开发学习进程 0.24 存储机制
  • 原文地址:https://www.cnblogs.com/firecode/p/4161001.html
Copyright © 2011-2022 走看看