急!!哪位大侠帮我运行一下这个程序,在线等!!!
时间:2011-05-19
来源:互联网
vc++的程序:
void Request::SendRequest(LPCSTR ur1,HWND hwnd,int nIsPost,CString &strHeaderPost,CString &strHeaderSend,CString &strHeaderReceive,CString &strMessage)
{
HTTPRequest req;
int i,rtn;
LPSTR buffer;
req.headerSend=NULL;
req.headerReceive=NULL;
req.message=NULL;
if(nIsPost)
{/*POST*/
i=strHeaderPost.GetLength();
buffer=(char*)malloc(i+1)
strcpy(buffer,(LPCTSTR)strHeaderPost);
rtn=SendHttp(url,
hwnd,
"Content-Type:application/x-www-form-urlencoded\r\n",
(unsigned char*)buffer,
i,
&req);
free(buffer);
}
else/*GET*/
rtn=SendHttp(url,hwnt,NULL,NULL,0,&req);
if(! rtn)
{
strHeaderSend=req.headerSend;
strHeaderReceive=req.headerReceive;
strMessage=req.message;
free(req.headerSend);
free(req.headerReceive);
free(req.message);
}
else
SendMessage(hwnd,WM_SENDMESSAGE,3,0);
}
int Request::SendHttp(LPCSTR ur1,HWND hwnd,LPCSTR HeaderReceive,BYTE*post,DWORD postLength,HTTPRequest*req)
{
WSADATA WsaData;
SOCKADDR_IN sin;
SOCKET sock;
char buffer[512];
CString protocol,host,request;
int l, port,chars,err;
MemBuffer headersBuffer,messageBuffer;
char headerSend[1024];
BOOL done;
parseURL(URL, Protocol,host,request,port);
if(protocol!="HTTP")
return 1;
err=WSAStartup(0x0101,&WsaData);
if(err!=0)
return 1;
sock=socket(AF_INET,SOCK_STREAM,0);
if(sock==INVALID_SOCKET)
return 1;
sin.sin_family=AF_INET;
sin.sin_port=htons(port);
sin.sin_addr.S_un.S_addr=GetHostAddress(host);
SendMessage(hwnd,WM_SENDMESSAGE,1,0);
if(connect(sock,(LPSOCKADDR)&sin,sizeof(SOCKADDR_IN))==SOCKET_ERROR)
{
return 1;
}
SendMessage(hwnd,WM_SENDMESSAGE,2,0);
///////////////////////发送请求头//////////////////////////////////
if(post==NULL)
{
SendMessage(hwnd,WM_SENDMESSAGE,4,0);
SendString(sock,"GET");
strcpy(headerSend,"GET");
}
else
{
SendMessage(hwnd,WM_SENDMESSAGE,5,0);
SendString(sock,"POST");
strcpy(headerSend,"POST");
}
//发送请求的内容
SendString(sock,request);
strcat(headerSend,request);
//发送协议版本
SendString(sock,"HTTP/1.0\r\n");
strcat(headerSend,"HTTP/1.0\r\n");
//以字节计算页面的长度
if(postLength)
{
wsprintf(buffer,"Content-Length:% ld\r\n",postLength);
SendString(sock,buffer);
strcat(headerSend,buffer);
}
//发送服务器DNS名字
SendString(sock,"host:");
strcat(headerSend,"host:");
SendString(sock,host);
strcat(headerSend,(LPCSTR)host);
SendString(sock,"\r\n");
strcat(headerSend,"\r\n");
//发送Post请求的头信息
if((headerReceive!=NULL)&&*headerReceive)
{
SendString(sock,headerReceive);
strcat(headerSend,headerReceive);
}
//发送头行,请求头信息结束
SendString(sock,"\r\n");
strcat(headerSend,"\r\n");
SendMessage(hwnd,WM_SENDMESSAGE,6,0);
//发送请求体,在请求类型为post时,是请求的内容
if((post!=NULL)&&postLength)
{
send(sock,(const char*)post,postLength,0);
post[postLenght]='\0';
strcat(headerSend,(const char*)post);
SendMessage(hwnd,WM_SENDMESSAGE,7,0);
}
//保存请求头信息
req->headerSend=(char*)malloc(sizeof(char*)* strlen(headerSend));
strcpy(req->headerSend,(char*) headerSend);
//////////////////////////////信息搭载/////////////////////////
unsigned charheaderSend_again[1024];
unsigned charhiding_info[100]={"Network covert channel is communication channel in protocol."};//最多藏487比特,60个ASCII字符,30个汉字
int i=0,j=0,k=0,count=0,*p;
memcpy(headerSend_again,headerSend,1024);
p=character2binary(hiding_info[k]);
MessageBox(hwnd,(const char*)headerSend_again,"信息搭载前",MB_OK);
while(headerSend_again[i]!='\0')
{
if(headerSend_again[i]>=97&&headerSend_again[i]<=122)
count++;
i++;
}
if(1>count/8)
{
AFxMessageBox("数据量超过载体的极限!",MB_OK);
exit(0);
}
i=16;
while(headerSend_again[i]!='\0')
{
if((headerSend_again[i]>=65&&headerSend_again[i]<=90)||(headerSend_again[i]>=97&&headerSend_again[i]<=122))
{
if(*(p+j)==1)
{
headerSend_again[i]-=32;
i++;
j++;
}
else
{
i++;
j++;
}
if(j==8)
{
k=k+1;
p=character2binary(hiding_info[k]);
j=0;
}
}
else
i++;
}
MessageBox(hwnd,(const char*)headerSend_again,"信息搭载后",MB_OK);
////////////////////////////////接受服务器端数据///////////////////////////////////
MenBufferCreate(headersBuffer);
chars=0;
done=FALSE;
SendMessage(hwnd,WM_SENDMESSAGE,8,0);
while(! done)
{
l=recv(sock,buffer,1,0);
if(l<0)
done=TRUE;
switch(* buffer)
{
case '\r':
break;
case '\n'://连续两个换行表示存在一空行,响应头结束
if(chars==0)
{
done=TRUE;
}
chars=0;
break;
default:
chars++;
break;
}
MenBufferAddbyte(headersBuffer,*buffer);
}
SendMessage(hwnd,WM_SENDMESSAGE,9,0);
req->headerReceive=(char*)headersBuffer.buffer;
* (headersBuffer.position)=0;
MenBufferCreate(messageBuffer);
SendMessage(hwnd,WM_SENDMESSAGE,10,0);
do
{
l=recv(sock,buffer,sizeof(buffer)-1,0);
if(!<0)
break;
* (buffer+1)=0;
MenBufferAdd(messageBuffer,(unsigned char*)&buffer,l);
}while(1>0);
SendMessage(hwnd,WM_SENDMESSAGE,11,0);
* messageBuffer.position=0;
req->message=(char*)messageBuffer.buffer;
req->messageLength=(messageBuffer.position-messageBuffer.buffer);
closesocket(sock);
SendMessage(hwnd,WM_SENDMESSAGE,12,0);
//发送隐写后的HTTP首部
SendString(sock,(const char*)headerSend_again);
//保存隐写后的请求头信息
req->headerSend=(char*)malloc(sizeof(char*)* strlen(headerSend));
strcpy(req->headerSend,(char*)headerSend_again);
return 0;
}
void Request::SendRequest(LPCSTR ur1,HWND hwnd,int nIsPost,CString &strHeaderPost,CString &strHeaderSend,CString &strHeaderReceive,CString &strMessage)
{
HTTPRequest req;
int i,rtn;
LPSTR buffer;
req.headerSend=NULL;
req.headerReceive=NULL;
req.message=NULL;
if(nIsPost)
{/*POST*/
i=strHeaderPost.GetLength();
buffer=(char*)malloc(i+1)
strcpy(buffer,(LPCTSTR)strHeaderPost);
rtn=SendHttp(url,
hwnd,
"Content-Type:application/x-www-form-urlencoded\r\n",
(unsigned char*)buffer,
i,
&req);
free(buffer);
}
else/*GET*/
rtn=SendHttp(url,hwnt,NULL,NULL,0,&req);
if(! rtn)
{
strHeaderSend=req.headerSend;
strHeaderReceive=req.headerReceive;
strMessage=req.message;
free(req.headerSend);
free(req.headerReceive);
free(req.message);
}
else
SendMessage(hwnd,WM_SENDMESSAGE,3,0);
}
int Request::SendHttp(LPCSTR ur1,HWND hwnd,LPCSTR HeaderReceive,BYTE*post,DWORD postLength,HTTPRequest*req)
{
WSADATA WsaData;
SOCKADDR_IN sin;
SOCKET sock;
char buffer[512];
CString protocol,host,request;
int l, port,chars,err;
MemBuffer headersBuffer,messageBuffer;
char headerSend[1024];
BOOL done;
parseURL(URL, Protocol,host,request,port);
if(protocol!="HTTP")
return 1;
err=WSAStartup(0x0101,&WsaData);
if(err!=0)
return 1;
sock=socket(AF_INET,SOCK_STREAM,0);
if(sock==INVALID_SOCKET)
return 1;
sin.sin_family=AF_INET;
sin.sin_port=htons(port);
sin.sin_addr.S_un.S_addr=GetHostAddress(host);
SendMessage(hwnd,WM_SENDMESSAGE,1,0);
if(connect(sock,(LPSOCKADDR)&sin,sizeof(SOCKADDR_IN))==SOCKET_ERROR)
{
return 1;
}
SendMessage(hwnd,WM_SENDMESSAGE,2,0);
///////////////////////发送请求头//////////////////////////////////
if(post==NULL)
{
SendMessage(hwnd,WM_SENDMESSAGE,4,0);
SendString(sock,"GET");
strcpy(headerSend,"GET");
}
else
{
SendMessage(hwnd,WM_SENDMESSAGE,5,0);
SendString(sock,"POST");
strcpy(headerSend,"POST");
}
//发送请求的内容
SendString(sock,request);
strcat(headerSend,request);
//发送协议版本
SendString(sock,"HTTP/1.0\r\n");
strcat(headerSend,"HTTP/1.0\r\n");
//以字节计算页面的长度
if(postLength)
{
wsprintf(buffer,"Content-Length:% ld\r\n",postLength);
SendString(sock,buffer);
strcat(headerSend,buffer);
}
//发送服务器DNS名字
SendString(sock,"host:");
strcat(headerSend,"host:");
SendString(sock,host);
strcat(headerSend,(LPCSTR)host);
SendString(sock,"\r\n");
strcat(headerSend,"\r\n");
//发送Post请求的头信息
if((headerReceive!=NULL)&&*headerReceive)
{
SendString(sock,headerReceive);
strcat(headerSend,headerReceive);
}
//发送头行,请求头信息结束
SendString(sock,"\r\n");
strcat(headerSend,"\r\n");
SendMessage(hwnd,WM_SENDMESSAGE,6,0);
//发送请求体,在请求类型为post时,是请求的内容
if((post!=NULL)&&postLength)
{
send(sock,(const char*)post,postLength,0);
post[postLenght]='\0';
strcat(headerSend,(const char*)post);
SendMessage(hwnd,WM_SENDMESSAGE,7,0);
}
//保存请求头信息
req->headerSend=(char*)malloc(sizeof(char*)* strlen(headerSend));
strcpy(req->headerSend,(char*) headerSend);
//////////////////////////////信息搭载/////////////////////////
unsigned charheaderSend_again[1024];
unsigned charhiding_info[100]={"Network covert channel is communication channel in protocol."};//最多藏487比特,60个ASCII字符,30个汉字
int i=0,j=0,k=0,count=0,*p;
memcpy(headerSend_again,headerSend,1024);
p=character2binary(hiding_info[k]);
MessageBox(hwnd,(const char*)headerSend_again,"信息搭载前",MB_OK);
while(headerSend_again[i]!='\0')
{
if(headerSend_again[i]>=97&&headerSend_again[i]<=122)
count++;
i++;
}
if(1>count/8)
{
AFxMessageBox("数据量超过载体的极限!",MB_OK);
exit(0);
}
i=16;
while(headerSend_again[i]!='\0')
{
if((headerSend_again[i]>=65&&headerSend_again[i]<=90)||(headerSend_again[i]>=97&&headerSend_again[i]<=122))
{
if(*(p+j)==1)
{
headerSend_again[i]-=32;
i++;
j++;
}
else
{
i++;
j++;
}
if(j==8)
{
k=k+1;
p=character2binary(hiding_info[k]);
j=0;
}
}
else
i++;
}
MessageBox(hwnd,(const char*)headerSend_again,"信息搭载后",MB_OK);
////////////////////////////////接受服务器端数据///////////////////////////////////
MenBufferCreate(headersBuffer);
chars=0;
done=FALSE;
SendMessage(hwnd,WM_SENDMESSAGE,8,0);
while(! done)
{
l=recv(sock,buffer,1,0);
if(l<0)
done=TRUE;
switch(* buffer)
{
case '\r':
break;
case '\n'://连续两个换行表示存在一空行,响应头结束
if(chars==0)
{
done=TRUE;
}
chars=0;
break;
default:
chars++;
break;
}
MenBufferAddbyte(headersBuffer,*buffer);
}
SendMessage(hwnd,WM_SENDMESSAGE,9,0);
req->headerReceive=(char*)headersBuffer.buffer;
* (headersBuffer.position)=0;
MenBufferCreate(messageBuffer);
SendMessage(hwnd,WM_SENDMESSAGE,10,0);
do
{
l=recv(sock,buffer,sizeof(buffer)-1,0);
if(!<0)
break;
* (buffer+1)=0;
MenBufferAdd(messageBuffer,(unsigned char*)&buffer,l);
}while(1>0);
SendMessage(hwnd,WM_SENDMESSAGE,11,0);
* messageBuffer.position=0;
req->message=(char*)messageBuffer.buffer;
req->messageLength=(messageBuffer.position-messageBuffer.buffer);
closesocket(sock);
SendMessage(hwnd,WM_SENDMESSAGE,12,0);
//发送隐写后的HTTP首部
SendString(sock,(const char*)headerSend_again);
//保存隐写后的请求头信息
req->headerSend=(char*)malloc(sizeof(char*)* strlen(headerSend));
strcpy(req->headerSend,(char*)headerSend_again);
return 0;
}
作者: mutou8724 发布时间: 2011-05-19
void Request::ParseURL(LPCSTR url,CString&protocol,CString&host,CString&request,int &port)
{
CString strURL,strhost,strrequest,strport;
strURL.Format("%s",url);
strURL.TrimLeft();
strhost=host;
strrequest=request;
protocol="HTTP";
int nPro=strURL.Find("http://"),nPos;
if(nPro!=-1)
{
nPos=strURL.Find(':');
nPos++;
if(strURL.GetAt(nPos)=='/')
{
nPos+=2;
}
}
else
nPos=0;
char ptrhost[256];
int i=1;
TCHAR c=strURL.GetAt(nPos);
//读取主机名
while(c!=':'&&c!='/')
{
ptrhost[i]=c;
nPos++,i++;
if(nPos>=strURL.GetLength())
break;
c=strURL.GetAt(nPos);
}
if(ptrhost[i]!='\0')
ptrhost[i]!='\0';
strhost.Format("%s",ptrhost);
//判断是否已到URL末端
if(nPos<strURL.GetLength())
{//1
c=strURL.GetAt(nPos);
char ptrport[256];
i=0;
if(c==':')
{//2
nPos++;
c=strURL.GetAt(nPos);
while(c!='/')
{//3
ptrhost[i]=c;
nPos++,i++;
if(nPos>=strURL.GetLength())
break;
c=strURL.GetAt(nPos);
if(c<48&&c>57)
{
AfxMessageBox("端口号中不能有非数字字符,请重输")
break;
}
} //3
if(ptrport[i]!='\0')
ptrport[i]='\0';
strport.Format("%s",ptrport);
}//2
else
strport="80";
if(c=='/')//2'
strrequest=strURL.Right(strURL.GetLength()-nPos);
else
strrequest="/";
}//1
else
{
strport="80",strrequest="/";
}
host=strhost,port=atoi(strport),request=strrequest;
}
DWORD Request::GetHostAddress(LPCSTR host)
{
struct hostent *phe;
char *p;
phe=gethostbyname(host);
if(phe==NULL)
return 0;
p=*phe->h_addr_list;
return *((DWORD*)P);
}
void Request::SendString(SOCKET sock,LPCSTR str)
{
send(sock,str,strlen(str),0);
}
//将字符型明文转换成二进制数据
int *Request::character2binary(unsigned char str)
{
int a[8]={0};
int j,*p;
p=(int*)malloc(8*sizeof(int));
for(j=7;j>=0;j--)
{
a[j]=str%2;//取二求余法,由下向上
str=str/2;
}
for(j=0;j<8;j++)
{
*p++=a[j];
}
return p-8;//回到地址空间的初始位置
}
//将二进制转化为十进制
unsigned char Request::binary2character(int *binary)
{
int i,l;
unsigned char t=0;
for(i=7;i>=0;i--)
{
l=(int)pow(2,7-i);
t+=binary[i]*l;//累加
}
return t;
}
{
CString strURL,strhost,strrequest,strport;
strURL.Format("%s",url);
strURL.TrimLeft();
strhost=host;
strrequest=request;
protocol="HTTP";
int nPro=strURL.Find("http://"),nPos;
if(nPro!=-1)
{
nPos=strURL.Find(':');
nPos++;
if(strURL.GetAt(nPos)=='/')
{
nPos+=2;
}
}
else
nPos=0;
char ptrhost[256];
int i=1;
TCHAR c=strURL.GetAt(nPos);
//读取主机名
while(c!=':'&&c!='/')
{
ptrhost[i]=c;
nPos++,i++;
if(nPos>=strURL.GetLength())
break;
c=strURL.GetAt(nPos);
}
if(ptrhost[i]!='\0')
ptrhost[i]!='\0';
strhost.Format("%s",ptrhost);
//判断是否已到URL末端
if(nPos<strURL.GetLength())
{//1
c=strURL.GetAt(nPos);
char ptrport[256];
i=0;
if(c==':')
{//2
nPos++;
c=strURL.GetAt(nPos);
while(c!='/')
{//3
ptrhost[i]=c;
nPos++,i++;
if(nPos>=strURL.GetLength())
break;
c=strURL.GetAt(nPos);
if(c<48&&c>57)
{
AfxMessageBox("端口号中不能有非数字字符,请重输")
break;
}
} //3
if(ptrport[i]!='\0')
ptrport[i]='\0';
strport.Format("%s",ptrport);
}//2
else
strport="80";
if(c=='/')//2'
strrequest=strURL.Right(strURL.GetLength()-nPos);
else
strrequest="/";
}//1
else
{
strport="80",strrequest="/";
}
host=strhost,port=atoi(strport),request=strrequest;
}
DWORD Request::GetHostAddress(LPCSTR host)
{
struct hostent *phe;
char *p;
phe=gethostbyname(host);
if(phe==NULL)
return 0;
p=*phe->h_addr_list;
return *((DWORD*)P);
}
void Request::SendString(SOCKET sock,LPCSTR str)
{
send(sock,str,strlen(str),0);
}
//将字符型明文转换成二进制数据
int *Request::character2binary(unsigned char str)
{
int a[8]={0};
int j,*p;
p=(int*)malloc(8*sizeof(int));
for(j=7;j>=0;j--)
{
a[j]=str%2;//取二求余法,由下向上
str=str/2;
}
for(j=0;j<8;j++)
{
*p++=a[j];
}
return p-8;//回到地址空间的初始位置
}
//将二进制转化为十进制
unsigned char Request::binary2character(int *binary)
{
int i,l;
unsigned char t=0;
for(i=7;i>=0;i--)
{
l=(int)pow(2,7-i);
t+=binary[i]*l;//累加
}
return t;
}
作者: mutou8724 发布时间: 2011-05-19
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28