【http报文格式】:

【用牡丹园BBS做测试】:

首先查看BBS源代码:(右键分别在BBS不同的两个区域点击并查看源代码,得到如下结果)

【找到HTML源码中相应的变量和表格提交的地址并用程序实现】:

【成功的运行】:(当然经过了N次测试,同时还感谢Inkoo的大力支持)

【程序源代码】:

/***************code.h********************/

#ifndef _CODE_H_
#define _CODE_H_

#include <string>
using namespace std;

class CCode
{
public:
string Encode(const string & str);
string Decode(const string & str);
};

#endif

/*****************code.cpp*************************/

#include "code.h"

string CCode::Encode(const string & str)
{
string ret="";
char buf[20];
int i=0;
while(i<str.length())
{
   if(str[i] & 0x80)
   {
    sprintf(buf,"%%%1X%1X",(unsigned char)str[i],(unsigned char)str[i+1]);
    ++i;
    ret+=buf;
   }
   else
    ret+=str[i];
   ++i;
}
return ret;
}

string CCode::Decode(const string & str)
{
string ret="";
string cur,all=str;
while(all.length()>0)
{
   int pos=all.find("%");
   if(pos!=0)
    ret+=all.substr(0,pos);
   cur=all.substr(pos+1,2);
   all=all.substr(pos+3);
   char ch;
   sscanf(cur.c_str(),"%x",&ch);
   ret+=(char)ch;
}
return ret;
}

/*************************http.h***************************/

#ifndef _HTTP_H_
#define _HTTP_H_

#include <winsock2.h>
#include <iostream>
#include <string>
using namespace std;

#pragma comment(lib,"ws2_32.lib")

#define BUFFER_SIZE 11400

class CHttp
{
public:
CHttp();
virtual ~CHttp();
private:
SOCKET m_SOCKET;
WSADATA m_WSADATA;
HOSTENT * m_HOSTENT;
SOCKADDR_IN m_SOCKADDR_IN;

char buf[BUFFER_SIZE];
int len;
private:
bool CreateSocket();
void ReleaseSocket();
public:
bool Connect(const string & httpAddr,const int port=80);
int SendData(const char * str);
string RecvData();
};

#endif

/************************http.cpp******************************/

#include "http.h"

void msg(char * str)
{
#ifdef _DEBUG
cout<<str<<endl;
#endif
}

CHttp::CHttp()
{
}

CHttp::~CHttp()
{
}

bool CHttp::CreateSocket()
{
if(WSAStartup(MAKEWORD(2,2),&m_WSADATA)==SOCKET_ERROR)
{
   msg("wsastartup");
   ReleaseSocket();
   return false;
}
if((m_SOCKET=socket(AF_INET,SOCK_STREAM,0))==SOCKET_ERROR)
{
   msg("socket");
   ReleaseSocket();
   return false;
}
return true;
}

void CHttp::ReleaseSocket()
{
shutdown(m_SOCKET,SD_BOTH);
closesocket(m_SOCKET);
WSACleanup();
}

bool CHttp::Connect(const string & httpAddr,const int port)
{
if(! CreateSocket())
   return false;
if((m_HOSTENT=gethostbyname(httpAddr.c_str()))==NULL)
{
   msg("gethostbyname");
   ReleaseSocket();
   return false;
}
if(m_HOSTENT->h_addr_list[0]==NULL)
{
   msg("h_addr_list");
   ReleaseSocket();
   return false;
}
memset(&m_SOCKADDR_IN,0,sizeof(m_SOCKADDR_IN));
m_SOCKADDR_IN.sin_family=AF_INET;
m_SOCKADDR_IN.sin_port=htons(port);
m_SOCKADDR_IN.sin_addr.S_un.S_addr=*(ULONG *)m_HOSTENT->h_addr_list[0];

int timeOut=5000;
if(::setsockopt(m_SOCKET,SOL_SOCKET,SO_SNDTIMEO,(char *)&timeOut,sizeof(timeOut))==SOCKET_ERROR)
   return false;
if(connect(m_SOCKET,(sockaddr *)&m_SOCKADDR_IN,sizeof(m_SOCKADDR_IN))==SOCKET_ERROR)
{
   msg("connect");
   ReleaseSocket();
   return false;
}
return true;
}

string CHttp::RecvData()
{
try
{
   len=recv(m_SOCKET,buf,sizeof(buf),0);
   if(len==SOCKET_ERROR)
    return "";
   buf[len]=0;
   return string(buf);
}
catch(...)
{
   return "";
}
}

int CHttp::SendData(const char * str)
{
return send(m_SOCKET,str,strlen(str),0);
}

/**************************main.cpp**************************/

#pragma warning (disable:4786)
#include <iostream>
#include <sstream>
#include <iterator>
#include <vector>
#include "http.h"
#include "code.h"
using namespace std;

string StoreCookies(const string & strRecv) //从登陆接收的数据中分离出Cookie信息合并成发送的格式
{
string sCookies;
istringstream ssin(strRecv);
string line;
while(! getline(ssin,line).eof())
{
   if(line.find("cookie")!=string::npos)
   {
    int pos[2];
    if((pos[0]=line.find("\'",0))!=string::npos && (pos[1]=line.find("\'",pos[0]+1))!=string::npos)
    {
     if(sCookies.length()>0)
      sCookies+=";";
     sCookies+=line.substr(pos[0]+1,pos[1]-pos[0]-1);
    }
   }
}
return sCookies;
}

int main()
{
CHttp http;
http.Connect("bbs.jlu.edu.cn");

/******************登陆BBS并提取Cookie*********************/
string login="POST /cgi-bin/bbslogin HTTP/1.1\r\n";
login+="Content-Type: application/x-www-form-urlencoded\r\n";
login+="Host: bbs.jlu.edu.cn\r\n";
login+="Content-Length: 27\r\n\r\n"; //HTTP头结束,两个"\r\n"
login+="id=luosiyong&pw='yourpwd'\r\n\r\n"; //提交表单内容 这里pw经过了处理

http.SendData(login.c_str());
string sRecv=http.RecvData();

cout<<"login response >>>>>>\n"<<sRecv<<endl;
string sCookie=StoreCookies(sRecv); //从登陆的信息提取cookie用于后面验证

/*******************发帖*************************************/
string post="POST /cgi-bin/bbssnd?board=Arctic&u=0&r=0 HTTP/1.1\r\n";
post+="Content-Type: application/x-www-form-urlencoded\r\n";
post+="Host: bbs.jlu.edu.cn\r\n";
post+="Content-Length: 50\r\n";
post+="Cookie: \r\n\r\n";
post+="title=测试&signature=1&text=文本!@#$^*()_+|[]'内容\r\n"; //注意不能包含%和&符号,它们在HTTP中用于转义和变量连接

post.insert(post.find("Cookie: ")+strlen("Cookie: "),sCookie); //在http头中加入Cookie信息

http.SendData(post.c_str());
cout<<http.RecvData()<<endl;

/*******************注销登陆**********************************/
string logout="GET /cgi-bin/bbslogout HTTP/1.1\r\n";
logout+="Host: bbs.jlu.edu.cn\r\n";
logout+="Cookie: \r\n\r\n";

logout.insert(logout.find("Cookie: ")+strlen("Cookie: "),sCookie);

http.SendData(logout.c_str());
cout<<http.RecvData()<<endl;

return 0;
}

本文使用Blog_Backup未注册版本导出,请到soft.pt42.com注册。

转载于:https://www.cnblogs.com/aquar/archive/2010/07/21/3451417.html

【转】socket提交http表单 [C++]相关推荐

  1. js异步提交form表单的解决方案

    1.定义异步提交表单的方法 (通用方法) /*** 异步提交form表单* @param options {form:form表单元素,success:执行成功后处理函数}* <span sty ...

  2. php 表单处理,用PHP提交from表单的处理方法

    用PHP提交from表单的处理方法 PHP独特的语法混合了C.Java.Perl以及PHP自创的语法.它可以比CGI或者Perl更快速地执行动态网页.下面是小编为大家搜索整理的PHP提交from表单的 ...

  3. Jquery通过Ajax方式来提交Form表单

    今天刚好看到Jquery的ajax提交数据到服务器的方法,原文是: 保存数据到服务器,成功时显示信息. jQuery 代码: $.ajax({type: "POST",url: & ...

  4. html form通过ajax提交表单提交数据,Jquery通过Ajax方式来提交Form表单的具体实现

    今天刚好看到Jquery的ajax提交数据到服务器的方法,原文是: 保存数据到服务器,成功时显示信息. jQuery 代码: $.ajax({ type: "POST", url: ...

  5. js 提交form表单,js更改form表单的action属性

    2019独角兽企业重金招聘Python工程师标准>>> js 提交form表单 <s:form id="formID1" action="favo ...

  6. 关于异步提交form表单

    1.异步提交form 表单 方法一: 采用隐藏iframe来提交表单, 代码:<div id="upload_file"  title="<%=Res.Cul ...

  7. php如何判断提交内容为空,php禁止提交空表单(php空值判断)的方法

    本节内容: php禁止提交空表单 如何在php编程中,判断表单中的空值呢?也就是对某些表单项禁止空值的提交. 1,可以修改代码,添加些判断: 复制代码 代码示例: if(empty($_POST['n ...

  8. formidable处理提交的表单或文件的简单介绍

    一般来说,客户端向服务端提交数据有GET和POST这两种方式,在之前的文章node.js当中的http模块与url模块的简单介绍当中我们可以知道通过req.url与url模块的配合处理可以快速得到客户 ...

  9. java向注册表单传递数据php_PHP提交from表单的方法

    PHP提交from表单的方法 PHP独特的语法混合了C.Java.Perl以及PHP自创的.语法.它可以比CGI或者Perl更快速地执行动态网页.下面是小编为大家搜索整理的PHP提交from表单的方法 ...

最新文章

  1. java ognl 性能_OGNL详解
  2. C语言指针调用函数_只愿与一人十指紧扣_新浪博客
  3. 关于编译GITHUB上的工程
  4. Linux——进程管理
  5. 彻底解决 libhdf5_hl.so.10: cannot open shared object file: No such file or directory
  6. ActiveMQ的消息存储(八)
  7. 阿里开发者招聘节 | 面试题05: 关于epoll和select的区别,哪些说法是正确的?
  8. kali Linux下wifi密码安全测试(1)虚拟机下usb无线网卡的挂载 【转】
  9. 软件中反跟踪技术和软件调试
  10. 人体肌肉怎么画?怎样才能画好人体肌肉?
  11. DNS 智能解析功能评测之华为云篇~
  12. 回声状态网络(ESN)原理详解(附源码实现)
  13. 分享添加字幕最简单的方法 视频制作超简单
  14. 《点燃我,温暖你》爱心代码复现
  15. 百货的客单价-林财添
  16. python DataFrame isin() 与 ~isin()
  17. educoder算法设计与分析 实验一扩展 袋鼠过河问题
  18. 生产者消费者问题——管程法
  19. 统计学中基础概念说明
  20. nba购票系统php,2019nba中国赛门票怎么买?(附票价+购票方式)

热门文章

  1. tp801单板微型计算机是什么,给TP801单板机配接RX—80打印机
  2. mysql查询结果输出文件_如何将MySQL查询输出保存到文件?
  3. java字符串转字符串数组_Java字符串数组到字符串
  4. linux导出日志命令_Linux中的导出命令
  5. android按钮_Android按钮
  6. sudoku me_Java Sudoku解算器程序
  7. 开课吧:哪些人适合转行做Web前端?
  8. OpenCV(一)Mac下OpenCV的安装和配置
  9. canvas学习笔记-贝塞尔曲线
  10. 阿里云成立技术脱贫联盟,要用技术助力脱贫