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,再单击此处开始下载或邮件给我索取源码 ([email protected] 或 [email protected]

 

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

 

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

 

3、程序运行效果:

 

VC POST表单——登录验证新浪邮箱_第1张图片

 

4、源码说明:

 

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

[cpp]  view plain copy print ?
  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. }  

 

你可能感兴趣的:(VC POST表单——登录验证新浪邮箱)