【转】socket提交http表单 [C++]
【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++]相关推荐
- js异步提交form表单的解决方案
1.定义异步提交表单的方法 (通用方法) /*** 异步提交form表单* @param options {form:form表单元素,success:执行成功后处理函数}* <span sty ...
- php 表单处理,用PHP提交from表单的处理方法
用PHP提交from表单的处理方法 PHP独特的语法混合了C.Java.Perl以及PHP自创的语法.它可以比CGI或者Perl更快速地执行动态网页.下面是小编为大家搜索整理的PHP提交from表单的 ...
- Jquery通过Ajax方式来提交Form表单
今天刚好看到Jquery的ajax提交数据到服务器的方法,原文是: 保存数据到服务器,成功时显示信息. jQuery 代码: $.ajax({type: "POST",url: & ...
- html form通过ajax提交表单提交数据,Jquery通过Ajax方式来提交Form表单的具体实现
今天刚好看到Jquery的ajax提交数据到服务器的方法,原文是: 保存数据到服务器,成功时显示信息. jQuery 代码: $.ajax({ type: "POST", url: ...
- js 提交form表单,js更改form表单的action属性
2019独角兽企业重金招聘Python工程师标准>>> js 提交form表单 <s:form id="formID1" action="favo ...
- 关于异步提交form表单
1.异步提交form 表单 方法一: 采用隐藏iframe来提交表单, 代码:<div id="upload_file" title="<%=Res.Cul ...
- php如何判断提交内容为空,php禁止提交空表单(php空值判断)的方法
本节内容: php禁止提交空表单 如何在php编程中,判断表单中的空值呢?也就是对某些表单项禁止空值的提交. 1,可以修改代码,添加些判断: 复制代码 代码示例: if(empty($_POST['n ...
- formidable处理提交的表单或文件的简单介绍
一般来说,客户端向服务端提交数据有GET和POST这两种方式,在之前的文章node.js当中的http模块与url模块的简单介绍当中我们可以知道通过req.url与url模块的配合处理可以快速得到客户 ...
- java向注册表单传递数据php_PHP提交from表单的方法
PHP提交from表单的方法 PHP独特的语法混合了C.Java.Perl以及PHP自创的.语法.它可以比CGI或者Perl更快速地执行动态网页.下面是小编为大家搜索整理的PHP提交from表单的方法 ...
最新文章
- java ognl 性能_OGNL详解
- C语言指针调用函数_只愿与一人十指紧扣_新浪博客
- 关于编译GITHUB上的工程
- Linux——进程管理
- 彻底解决 libhdf5_hl.so.10: cannot open shared object file: No such file or directory
- ActiveMQ的消息存储(八)
- 阿里开发者招聘节 | 面试题05: 关于epoll和select的区别,哪些说法是正确的?
- kali Linux下wifi密码安全测试(1)虚拟机下usb无线网卡的挂载 【转】
- 软件中反跟踪技术和软件调试
- 人体肌肉怎么画?怎样才能画好人体肌肉?
- DNS 智能解析功能评测之华为云篇~
- 回声状态网络(ESN)原理详解(附源码实现)
- 分享添加字幕最简单的方法 视频制作超简单
- 《点燃我,温暖你》爱心代码复现
- 百货的客单价-林财添
- python DataFrame isin() 与 ~isin()
- educoder算法设计与分析 实验一扩展 袋鼠过河问题
- 生产者消费者问题——管程法
- 统计学中基础概念说明
- nba购票系统php,2019nba中国赛门票怎么买?(附票价+购票方式)
热门文章
- tp801单板微型计算机是什么,给TP801单板机配接RX—80打印机
- mysql查询结果输出文件_如何将MySQL查询输出保存到文件?
- java字符串转字符串数组_Java字符串数组到字符串
- linux导出日志命令_Linux中的导出命令
- android按钮_Android按钮
- sudoku me_Java Sudoku解算器程序
- 开课吧:哪些人适合转行做Web前端?
- OpenCV(一)Mac下OpenCV的安装和配置
- canvas学习笔记-贝塞尔曲线
- 阿里云成立技术脱贫联盟,要用技术助力脱贫