//聽stdafx.h聽:聽鏍囧噯緋葷粺鍖呭惈鏂囦歡鐨勫寘鍚枃浠訛紝
//聽鎴栨槸緇忓父浣跨敤浣嗕笉甯告洿鏀圭殑
//聽鐗瑰畾浜庨」鐩殑鍖呭惈鏂囦歡
//
#pragma聽once
#include聽"targetver.h"
#include聽<stdio.h>
#include聽<tchar.h>
#include聽<iostream>聽
using聽namespace聽std;
typedef聽unsigned聽short聽USHORT;
typedef聽unsigned聽char聽UCHAR;
#define聽URG聽0x20聽
#define聽ACK聽0x10聽
#define聽PSH聽0x08聽
#define聽RST聽0x04聽
#define聽SYN聽0x02聽
#define聽FIN聽0x01聽
typedef聽struct聽ip_hdr聽//瀹氫箟IP棣栭儴聽
{聽
聽聽聽聽unsigned聽char聽h_verlen;聽//4浣嶉閮ㄩ暱搴?4浣岻P鐗堟湰鍙仿?/span>
聽聽聽聽unsigned聽char聽tos;聽//8浣嶆湇鍔$被鍨婽OS聽
聽聽聽聽unsigned聽short聽total_len;聽//16浣嶆婚暱搴︼紙瀛楄妭錛壜?/span>
聽聽聽聽unsigned聽short聽ident;聽//16浣嶆爣璇喡?/span>
聽聽聽聽unsigned聽short聽frag_and_flags;聽//3浣嶆爣蹇椾綅聽
聽聽聽聽unsigned聽char聽ttl;聽//8浣嶇敓瀛樻椂闂綽燭TL聽
聽聽聽聽unsigned聽char聽proto;聽//8浣嶅崗璁?TCP,聽UDP聽鎴栧叾浠?聽
聽聽聽聽unsigned聽short聽checksum;聽//16浣岻P棣栭儴鏍¢獙鍜屄?/span>
聽聽聽聽unsigned聽int聽sourceIP;聽//32浣嶆簮IP鍦板潃聽
聽聽聽聽unsigned聽int聽destIP;聽//32浣嶇洰鐨処P鍦板潃聽
}IPHEADER;聽
typedef聽struct聽tsd_hdr聽//瀹氫箟TCP浼閮?/span>
{聽
聽聽聽聽unsigned聽long聽saddr;聽//婧愬湴鍧聽
聽聽聽聽unsigned聽long聽daddr;聽//鐩殑鍦板潃聽
聽聽聽聽char聽mbz;聽
聽聽聽聽char聽ptcl;聽//鍗忚綾誨瀷聽
聽聽聽聽unsigned聽short聽tcpl;聽//TCP闀垮害聽
}PSDHEADER;聽
typedef聽struct聽tcp_hdr聽//瀹氫箟TCP棣栭儴聽
{聽
聽聽聽聽USHORT聽th_sport;聽//16浣嶆簮绔彛聽
聽聽聽聽USHORT聽th_dport;聽//16浣嶇洰鐨勭鍙B?/span>
聽聽聽聽unsigned聽int聽th_seq;聽//32浣嶅簭鍒楀彿聽
聽聽聽聽unsigned聽int聽th_ack;聽//32浣嶇‘璁ゅ彿聽
聽聽聽聽unsigned聽char聽th_lenres;聽//4浣嶉閮ㄩ暱搴?6浣嶄繚鐣欏瓧聽
聽聽聽聽unsigned聽char聽th_flag;聽//6浣嶆爣蹇椾綅聽
聽聽聽聽USHORT聽th_win;聽//16浣嶇獥鍙eぇ灝徛?/span>
聽聽聽聽USHORT聽th_sum;聽//16浣嶆牎楠屽拰聽
聽聽聽聽USHORT聽th_urp;聽//16浣嶇揣鎬ユ暟鎹亸縐婚噺聽
}TCPHEADER;聽
//聽TODO:聽鍦ㄦ澶勫紩鐢ㄧ▼搴忛渶瑕佺殑鍏朵粬澶存枃浠?br />
#include聽"StdAfx.h"
#include聽"HttpWeb.h"
#include聽<winsock2.h>聽
#include聽<ws2tcpip.h>聽
#pragma聽comment(lib,"ws2_32.lib")聽聽
#define聽winsock_version聽0x0101
//CheckSum:璁$畻鏍¢獙鍜岀殑瀛愬嚱鏁奧?/span>
USHORT聽HttpWeb::checksum(USHORT聽*buffer,聽int聽size)聽
{聽
聽聽聽聽unsigned聽long聽cksum=0;聽
聽聽聽聽while(size聽>1)聽
聽聽聽聽{聽
聽聽聽聽聽聽聽聽cksum聽+=聽*buffer++;聽
聽聽聽聽聽聽聽聽size聽-=聽sizeof(USHORT);聽
聽聽聽聽}聽
聽聽聽聽if(size)聽
聽聽聽聽{聽
聽聽聽聽聽聽聽聽cksum聽+=聽*(UCHAR*)buffer;聽
聽聽聽聽}聽
聽聽聽聽cksum聽=聽(cksum聽>>聽16)聽+聽(cksum聽&聽0xffff);聽
聽聽聽聽cksum聽+=聽(cksum聽>>16);聽
聽聽聽聽return聽(USHORT)(~cksum);聽
};
HttpWeb::HttpWeb(void)
{
}
HttpWeb::~HttpWeb(void)
{
}
void聽UseAge()
{
聽聽聽聽printf("********************************************************************\n");聽
聽聽聽聽printf("Vote聽For聽yeshj\n");聽
聽聽聽聽printf("\t聽Written聽by聽yurow\n");聽
聽聽聽聽printf("\t聽Email:聽yurow@163.com\n");聽
聽聽聽聽printf("\t聽Blog:聽birdshover.cnblogs.com\n");聽
聽聽聽聽printf("Useage:聽sniffer聽ip聽to聽vote\n");聽
聽聽聽聽printf("********************************************************************\n");聽
}
bool聽HttpWeb::Post(char聽host[],聽char聽path[],聽char聽parms[],int聽port)
{
聽聽聽聽UseAge();
聽聽聽聽WSADATA聽WSAData;聽
聽聽聽聽SOCKET聽sock;
聽聽聽聽SOCKADDR_IN聽addr_in;聽
聽聽聽聽IPHEADER聽ipHeader;聽
聽聽聽聽TCPHEADER聽tcpHeader;聽
聽聽聽聽PSDHEADER聽psdHeader;聽
聽聽聽聽char聽szSendBuf[4000]聽=聽{0};聽
聽聽聽聽BOOL聽flag;
聽聽聽聽int聽rect,nTimeOver;聽
聽聽聽聽if聽(WSAStartup(MAKEWORD(2,2),聽&WSAData)!=0)聽
聽聽聽聽{
聽聽聽聽聽聽聽聽printf("WSAStartup聽Error!\n");聽
聽聽聽聽聽聽聽聽return聽false;聽
聽聽聽聽}
聽聽聽聽if聽((sock聽=聽WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAPPED))聽==聽INVALID_SOCKET)聽
聽聽聽聽{
聽聽聽聽聽聽聽聽printf("Socket聽Setup聽Error!\n");聽
聽聽聽聽聽聽聽聽return聽false;聽
聽聽聽聽}
聽聽聽聽flag=true;聽
聽聽聽聽if聽(setsockopt(sock,IPPROTO_IP,聽IP_HDRINCL,(char聽*)&flag,sizeof(flag))聽==聽SOCKET_ERROR)聽
聽聽聽聽{聽
聽聽聽聽聽聽聽聽printf("setsockopt聽IP_HDRINCL聽error!\n");聽
聽聽聽聽聽聽聽聽return聽false;聽
聽聽聽聽}聽
聽聽聽聽nTimeOver=1000;聽
聽聽聽聽if聽(setsockopt(sock,聽SOL_SOCKET,聽SO_SNDTIMEO,聽(char*)&nTimeOver,聽sizeof(nTimeOver))聽==聽SOCKET_ERROR)聽
聽聽聽聽{聽
聽聽聽聽聽聽聽聽printf("setsockopt聽SO_SNDTIMEO聽error!\n");聽
聽聽聽聽聽聽聽聽return聽false;聽
聽聽聽聽}聽
聽聽聽聽char聽requestString[4000]聽=聽{0};
聽聽聽聽if(strlen(parms)聽>聽0)
聽聽聽聽聽聽聽聽strcat(requestString,"POST聽");
聽聽聽聽else
聽聽聽聽聽聽聽聽strcat(requestString,"GET聽");
聽聽聽聽strcat(requestString,path);
聽聽聽聽strcat(requestString,"聽HTTP/1.1\r\n");
聽聽聽聽strcat(requestString,"Host:聽");
聽聽聽聽strcat(requestString,host);
聽聽聽聽strcat(requestString,"\r\nAccept:聽*/*\r\n");
聽聽聽聽strcat(requestString,"Accept-Language:聽zh-cn\r\n");
聽聽聽聽strcat(requestString,"User-Agent:聽Mozilla/4.0聽(compatible;聽MSIE聽7.0;聽Windows聽NT聽5.2;聽Trident/4.0;)\r\n");
聽聽聽聽strcat(requestString,"Accept-Encoding:聽gzip,聽deflate\r\n");
聽聽聽聽strcat(requestString,"Connection:聽Keep-Alive\r\n");
聽聽聽聽
聽聽聽聽if(strlen(parms)聽>聽0){
聽聽聽聽聽聽聽聽strcat(requestString,"Content-Type:聽application/x-www-form-urlencoded\r\n");
聽聽聽聽聽聽聽聽strcat(requestString,"Content-Length:聽");
聽聽聽聽聽聽聽聽char聽*聽p聽=聽new聽char[4];
聽聽聽聽聽聽聽聽itoa(strlen(parms),p,10);聽聽聽
聽聽聽聽聽聽聽聽strcat(requestString,p);
聽聽聽聽聽聽聽聽strcat(requestString,"\r\n\r\n");
聽聽聽聽聽聽聽聽strcat(requestString,parms);
聽聽聽聽聽聽聽聽strcat(requestString,"\r\n\r\n");
聽聽聽聽}
聽聽聽聽cout聽<<聽requestString;
聽聽聽聽int聽postDataLength聽=聽strlen(requestString);
聽聽聽聽LPHOSTENT聽lphostent聽=聽gethostbyname(host);
聽聽聽聽
聽聽聽聽
聽聽聽聽addr_in.sin_family聽=聽AF_INET;聽
聽聽聽聽addr_in.sin_port聽=聽htons(port);聽
聽聽聽聽//addr_in.sin_addr=聽*((LPIN_ADDR)*lphostent->h_addr_list);聽
聽聽聽聽addr_in.sin_addr聽=聽*(in_addr聽*)lphostent->h_addr_list[0];聽
聽聽聽聽//濉厖IP棣栭儴聽
聽聽聽聽ipHeader.h_verlen=(聽4<<4聽|聽sizeof(ipHeader)/sizeof(unsigned聽long));聽
聽聽聽聽//ipHeader.tos=0;聽
聽聽聽聽ipHeader.total_len聽=聽htons(sizeof(ipHeader)聽+聽sizeof(tcpHeader));聽
聽聽聽聽ipHeader.ident=1;聽
聽聽聽聽ipHeader.frag_and_flags=0;聽
聽聽聽聽ipHeader.ttl聽=聽128;聽
聽聽聽聽ipHeader.proto聽=聽IPPROTO_TCP;聽
聽聽聽聽ipHeader.checksum聽=聽0;聽
聽聽聽聽ipHeader.sourceIP聽=聽inet_addr("192.168.19.1");聽
聽聽聽聽ipHeader.destIP聽=聽addr_in.sin_addr.S_un.S_addr;
聽聽聽聽//濉厖TCP棣栭儴聽
聽聽聽聽tcpHeader.th_dport聽=聽htons(port);聽聽//鐩爣绔彛
聽聽聽聽tcpHeader.th_sport=htons(4000);聽//婧愮鍙e彿聽
聽聽聽聽tcpHeader.th_seq聽=聽htonl(0x12345678);聽
聽聽聽聽tcpHeader.th_ack=0;聽
聽聽聽聽tcpHeader.th_lenres聽=聽(sizeof(tcpHeader)聽/聽4聽<<4|聽0);聽
聽聽聽聽tcpHeader.th_flag聽=聽2;聽//淇敼榪欓噷鏉ュ疄鐜頒笉鍚岀殑鏍囧織浣嶆帰嫻嬶紝2鏄疭YN錛?鏄疐IN錛?6鏄疉CK鎺㈡祴聽絳夌瓑聽
聽聽聽聽tcpHeader.th_win=聽htons(512);聽
聽聽聽聽tcpHeader.th_urp=0;聽
聽聽聽聽tcpHeader.th_sum=0;聽
聽聽聽聽psdHeader.saddr聽=聽ipHeader.sourceIP;聽
聽聽聽聽psdHeader.daddr聽=聽ipHeader.destIP;聽
聽聽聽聽psdHeader.mbz聽=聽0;聽
聽聽聽聽psdHeader.ptcl聽=聽IPPROTO_TCP;聽
聽聽聽聽psdHeader.tcpl聽=聽htons(sizeof(tcpHeader));聽
聽聽聽聽//璁$畻鏍¢獙鍜屄?/span>
聽聽聽聽memcpy(szSendBuf,聽&psdHeader,聽sizeof(psdHeader));聽
聽聽聽聽memcpy(szSendBuf+sizeof(psdHeader),聽&tcpHeader,聽sizeof(tcpHeader));聽
聽聽聽聽tcpHeader.th_sum=checksum((USHORT聽*)szSendBuf,sizeof(psdHeader)+sizeof(tcpHeader));聽
聽聽聽聽memcpy(szSendBuf,聽&ipHeader,聽sizeof(ipHeader));聽
聽聽聽聽memcpy(szSendBuf+sizeof(ipHeader),聽&tcpHeader,聽sizeof(tcpHeader));聽
聽聽聽聽memset(szSendBuf+sizeof(ipHeader)+sizeof(tcpHeader),聽0,聽4);聽
聽聽聽聽ipHeader.checksum=checksum((USHORT聽*)szSendBuf,聽sizeof(ipHeader)+sizeof(tcpHeader));聽
聽聽聽聽memcpy(szSendBuf,聽&ipHeader,聽sizeof(ipHeader));聽
聽聽聽聽memcpy(szSendBuf聽+聽sizeof(ipHeader)+sizeof(tcpHeader),requestString,postDataLength);
聽聽聽聽cout聽<<聽szSendBuf聽<<聽endl;
聽聽聽聽rect=sendto(sock,聽szSendBuf,聽sizeof(ipHeader)+sizeof(tcpHeader)聽+聽postDataLength,聽0,聽(struct聽sockaddr*)&addr_in,聽sizeof(addr_in));聽
聽聽聽聽
聽聽聽聽cout聽<<聽rect聽<<聽"\t"聽<<聽sizeof(ipHeader)聽+聽sizeof(tcpHeader)聽+聽postDataLength聽<<聽endl;
聽聽聽聽
聽聽聽聽if聽(rect聽==聽SOCKET_ERROR聽||聽rect聽>聽10000L)聽
聽聽聽聽{聽
聽聽聽聽聽聽聽聽printf("send聽error!:%d\n",WSAGetLastError());聽
聽聽聽聽聽聽聽聽return聽false;聽
聽聽聽聽}聽
聽聽聽聽else聽
聽聽聽聽聽聽聽聽printf("send聽ok!\n");聽
聽聽聽聽closesocket(sock);聽
聽聽聽聽WSACleanup();聽
聽聽聽聽return聽false;
}

]]>