普通的嗅探器,网络抓包工具都做了相应的处理,一般抓到的http数据包都是经过处理的,基本上看不到底层的socket传输信息,我现在想做的是用socket模拟浏览器实现网页通讯。但是,经过抓包发现,在发送GET请求前已经发送了两个数据包,一个52 一个40字节的长度的包,这个包,包含的浏览器的信息,或者其他信息,一下是我在一个网站上抓取的数据头信息,总共三次,上面三个是三次第一个包的,下面三个是三次第二个包的信息。
0000: 45 00 00 34 14 22 00 00 34 06 96 7B 74 FF 90 75 E..4."..4..{t..u
0016: C0 A8 16 0A 00 50 0F 5E 61 EA 2E 4B D3 18 DA C8 .....P.^a..K....
0032: 80 12 40 00 05 30 00 00 02 04 05 A0 01 03 03 00 ..@..0..........
0048: 01 01 04 02 ....
0000: 45 00 00 34 75 D2 00 00 34 06 34 CB 74 FF 90 75 E..4u...4.4.t..u
0016: C0 A8 16 0A 00 50 0F 62 6C 5A 2B 64 6E 1A A8 6D .....P.blZ+dn..m
0032: 80 12 40 00 94 FC 00 00 02 04 05 A0 01 03 03 00 ..@.............
0048: 01 01 04 02 ....
0000: 45 00 00 34 14 7B 00 00 35 06 95 22 74 FF 90 75 E..4.{..5.."t..u
0016: C0 A8 16 0A 00 50 0F 78 76 54 DC 9D 2E E7 BC 19 .....P.xvT......
0032: 80 12 40 00 05 3A 00 00 02 04 05 A0 01 03 03 00 ..@..:..........
0048: 01 01 04 02
0000: 45 00 00 28 14 D9 40 00 34 06 55 D0 74 FF 90 75 E..(..@.4.U.t..u
0016: C0 A8 16 0A 00 50 0F 5E 61 EA 2E 4C D3 18 DD A8 .....P.^a..L....
0032: 50 10 FD 1F 85 E7 00 00 P.......
0000: 45 00 00 28 76 E0 40 00 34 06 F3 C8 74 FF 90 75 E..(v.@.4...t..u
0016: C0 A8 16 0A 00 50 0F 62 6C 5A 2B 65 6E 1A AB 4D .....P.blZ+en..M
0032: 50 10 FD 1F 15 B4 00 00 P.......
0000: 45 00 00 34 14 86 00 00 34 06 96 17 74 FF 90 75 E..4....4...t..u
0016: C0 A8 16 0A 00 50 0F 79 2C EA AC F4 F9 B0 A4 33 .....P.y,......3
0032: 80 12 40 00 CB 68 00 00 02 04 05 A0 01 03 03 00 ..@..h..........
0048: 01 01 04 02 ....
网页浏览的源码如下
#include "StdAfx.h"
#include "MyHttpSocket.h"
#pragma comment(lib,"Ws2_32.lib")
CMyHttp::CMyHttp()
{
m_isInit=false;
}
CMyHttp::~CMyHttp()
{
Stop();
WSACleanup();
}
char fname[256];
void LogFile(char *p)
{
FILE *fp=fopen(fname,"a+");
fprintf(fp,"%s ",p);
fclose(fp);
}
BOOL CMyHttp::Initlization()
{
// HttpClient();
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return FALSE;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return FALSE;
}
sockClient=socket(AF_INET,SOCK_STREAM,0);
if(sockClient!=NULL)
{
m_isInit=true;
return TRUE;
}
return FALSE;
}
CString CMyHttp::Start(CString strHost)
{
if(m_isInit==false){return "";}
SOCKADDR_IN addrSrv;
char ta=0x0d;
HOSTENT* pHost;
pHost=gethostbyname("www.baidu.com");
addrSrv.sin_addr.S_un.S_addr=*((DWORD*)pHost->h_addr_list[0]);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(80);
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
char acHeader[]={0x45,0x00,0x00,0x34,0x20,0x7C,0x00,0x00,0x34,0x06,0x8A,0x21,0x74,0xFF,0x90,0x75
,0xC0,0xA8,0x16,0x0A,0x00,0x50,0x0C,0xC3,0x8E,0x8D,0x4B,0x2E,0x5C,0xD8,0x20,0x1B
,0x80,0x12,0x40,0x00,0xEF,0x32,0x00,0x00,0x02,0x04,0x05,0xA0,0x01,0x03,0x03,0x00
,0x01 ,0x01 ,0x04 ,0x02};
int iDataLen=strlen(acHeader);
int iSendLen=send(sockClient,acHeader,52,0);
char acHeader2[]={0x45,0x00,0x00,0x28,0x21,0x54,0x40,0x00,0x34,0x06,0x49,0x55,0x74,0xFF,0x90,0x75
,0xC0,0xA8,0x16,0x0A,0x00,0x50,0x0C,0xC3,0x8E,0x8D,0x4B,0x2F,0x5C,0xD8,0x22,0xFB
,0x50,0x10,0xFD,0x1F,0x6F,0xEA,0x00,0x00};
iDataLen=strlen(acHeader2);
iSendLen=send(sockClient,acHeader2,40,0);
char acData0[]="GET / HTTP/1.1\r\n\
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint, */*\r\n\
Accept-Language: zh-cn\r\n\
Accept-Encoding: gzip, deflate\r\n\
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)\r\n\
Host: www.baidu.com\r\n\
Connection: Keep-Alive\r\n\
Cookie: Grix_2132_sid=zSxjJR; Grix_2132_saltkey=DQuF3h3Q; Grix_2132_lastvisit=1322836336; Grix_2132_lastact=1322914181%09home.php%09misc; Grix_2132_auth=37dfhTSg4hkgJYXGAcDiktq6tBLYEIJWw9UEXTgxeOrv9v2EuBsLhpq3xscDmrtt%2BYVsxXZ8vL7MB1S%2BynoHeEIjSA; Grix_2132_connect_is_bind=0; Grix_2132_mrd=%09; Grix_2132_ulastactivity=f0901LxkjbjeXyww5PH2aS%2F6CvXrYJU9FVGKBeh8WxINY6U5IZt6; Grix_2132_fid23=1322913237; Grix_2132_visitedfid=23";
iDataLen=strlen(acData0);
iSendLen=send(sockClient,acData0,iDataLen,0);
if(iSendLen==iDataLen)
{
TRACE("send=%d",iSendLen);
}
char recvBuf[4096];
CString strRevciveData;
int iRecvLen=0;
do
{ memset(recvBuf,0,4096);
iRecvLen= recv(sockClient,recvBuf,4096,0);
strRevciveData+=recvBuf;
if(iRecvLen==-1)
{
break;
}
}while(iRecvLen!=0);
return strRevciveData;
}