+ -
当前位置:首页 → 问答吧 → 急!!哪位大侠帮我运行一下这个程序,在线等!!!

急!!哪位大侠帮我运行一下这个程序,在线等!!!

时间: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;
}





作者: 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;
}




作者: mutou8724   发布时间: 2011-05-19