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、程序运行效果:

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

 5、源码下载地址

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

转载于:https://www.cnblogs.com/firecode/p/4161001.html

VC POST表单——登录验证新浪邮箱相关推荐

  1. 表单提交验证新实践之class-validator

    class-validator实践篇 之前有一篇关于class-validator的基础的介绍,这篇来一下如何实践: 首先介绍一下业务背景:简单来说就是一个表单提交 ,根据类型的选择进行四种提交模式. ...

  2. web实验新浪邮箱、下拉小说列表、验证用户登录

    html.css.js 新浪邮箱 下拉小说列表 验证用户登录 新浪邮箱 1.制作以下的新浪 邮箱登录界面: 要求: 1)首先给文本框制作细边框样式,当鼠标放在文本框上时,输入框的边框颜色发生变化,当鼠 ...

  3. js登录特效+ajax提交表单+异步刷新验证

    今天成功测试一种js登录特效+ajax提交表单+异步刷新验证,登录时特效提醒,无刷新ajax提交表单,获取验证结果,跳转正式页面:废话不多说,先直接分享代码: 1.主界面index.php  加载的这 ...

  4. 新工具:表单/Cookie 验证网站爬网设置工具

    在今年3月份的blog里面,我曾经说过SharePoint Team将会发布一个补丁来让SharePoint Server 2007的搜索引擎支持对基于表单/Cookie验证的网站进行爬网.今天,Sh ...

  5. 在ASP.NET中如何用C#.NET实现基于表单的验证

    这篇文章引用到了Microsoft .NET类库中的以下名空间: System.Data.SqlClient System.Web.Security ------------------------- ...

  6. [转]在ASP.NET中如何用C#.NET实现基于表单的验证(二)

    (五)创建Logon.aspx页面 1.在已创建好的项目里创建一个新的Web 窗体,名为Logon.aspx. 2.在编辑器里打开Logon.aspx,切换到HTML视图. 3.复制下面代码,然后在编 ...

  7. EasyUI加zTree使用解析 easyui修改操作的表单回显方法 验证框提交表单前验证 datagrid的load方法

    带参提交一次查询,从服务器加载新数据.这是一个神奇的方法 $('#dg').datagrid('load',{code: '01',name: 'name01' }); easyui修改操作的回显方法 ...

  8. EasyUI加zTree使用解析 easyui修改操作的表单回显方法 验证框提交表单前验证 datagrid的load方法...

    带参提交一次查询,从服务器加载新数据.这是一个神奇的方法 $('#dg').datagrid('load',{code: '01',name: 'name01' }); easyui修改操作的回显方法 ...

  9. springsecurity不拦截某个接口_SpringSecurity 默认表单登录页展示流程源码

    SpringSecurity 默认表单登录页展示流程源码 本篇主要讲解 SpringSecurity提供的默认表单登录页 它是如何展示的的流程,涉及1.FilterSecurityIntercepto ...

最新文章

  1. WINCE下如何虚拟多个串口
  2. 成功解决Python中出现的TypeError: object of type 'zip' has no len()
  3. 计算机控制技术汤楠课后答案,西安电子科大版汤楠计算机控制技术6章
  4. JAVA格式化当前日期或者取年月日
  5. shell远程执行命令
  6. html5离开网页自动暂停,通过html5代码在网页中实现播放和暂停音乐mp3,mav等文
  7. 销售额分布直方图和茎叶图
  8. python3--匿名函数
  9. 施耐德电气的 Modicon PLC 中被曝严重漏洞,已有缓解措施
  10. VS2015搭建汇编语言环境和代码高亮插件AsmDude
  11. 日语学习 「バージョン」 version と 「リビジョン」 revision
  12. ASP.NET Core 部署到Cont OS 服务器
  13. Atitit ocr的艺术 艾提拉著 目录 1. OCR可以说是一门非常“古老”的技术,在上世纪50年代到90年代, 1 1.1. 场景文字识别技术(Scene Text Recognition,
  14. vb改动microsip让microsip隐藏然后命令拨打电话
  15. 基于开源框架urule的规则引擎
  16. pdf文件如何转换成dwg文件
  17. 乐华娱乐向港交所提交上市申请:2021年赚4亿元,韩庚亦是股东
  18. Hyperledger Fabric Service Discovery CLI(服务发现命令行工具)学习笔记
  19. java全角数字_Java全角、半角字符的关系以及转换
  20. 【转】王阳明:耐住寂寞,守得花开

热门文章

  1. java调用ocx控件获取数据_Java调用ocx控件以及dll
  2. 设计模式(现在只总结了常用的8种)
  3. 不是天才的我们,想要一次性过2019年一级建造师,过来人经验告诉你
  4. MybatisPlus分表
  5. php中怎么取出数组中的值,php怎么取出数组内指定的值
  6. python类的析构方法是什么_python类的析构方法是什么_python类析构
  7. 前端女娲补天 前端(一) 前端性能的优化方式
  8. c语言250行游戏代码大全,最经典的PASCAL游戏!300行程序代码,超爽!
  9. 3GPP协议学习-TS 38.211-NR;物理信道与调制
  10. 提取加密文件中的pdf