对sokcet编程http数据的分析

来源:互联网 发布:js控制图片360度旋转 编辑:程序博客网 时间:2024/06/03 16:52
#include <stdio.h>
#include <winsock.h>
#include <string.h>
#pragma comment(lib, "ws2_32.lib")


#define RECV_SIZE 1024


char * cmp(char *p, char *buf_cmp)
{
char buf[100] = "";
char *qf = p;
char *qb = NULL;


memset(buf, '\0', sizeof(buf));
memcpy(buf, buf_cmp, strlen(buf_cmp)+1 );


qb = p + strlen(buf)-1;
while(*qb != '\0')
{

if( (*qf == buf[0]) && (*qb == buf[strlen(buf)-1]) )
{
if( ( *(qf+1) == buf[1] )&&( *(qb-1) == buf[strlen(buf)-2] ) )
return qb+1;
}
qf++;
qb++;
}
return NULL;


}




void geturl(char *url)
{
WSADATA WSAData = {0};  //定义初始化变量
SOCKET  sockfd;         

struct sockaddr_in server_addr;
struct hostent   *pURL;  //window 下hostent结构体指针


char *p = NULL;
char *q = NULL;
char host[RECV_SIZE] = "";
char header[RECV_SIZE] = "";
static char recv_buf[RECV_SIZE];
int i = 0;
int err = 0;

int sum = 0;
int text_len = 0;
char *start = NULL;
FILE *fp;

memset( header, '\0', RECV_SIZE );
fp = fopen( "mysocket_test.gzip", "wb" );    //打开文件以wb的形式打开,这样才可以,因为压缩形式就是以二进制读写的!!
if(fp == NULL)


{
printf("--------fopen error----\n");
}

/**********************
windows下创建socket前,必须初始化,用WSAStartup初始化
在windows下面创建socket套接字,必须提前用此函数初始化
***********************/
if( WSAStartup(MAKEWORD(2, 2), &WSAData) )
{
printf("-------WSA failed----------\n");
return ;
}
printf("--------初始化over-----------\n");




/****************
分离url中主机地址和相对路径,一字符'/',切割!!
切割出访问ip地址!!
*****************/
sscanf(url,"%[^/]",host);


sprintf(url,"%s%s","http://","www.baidu.com/");
printf("============000000000000000000===========%s\n",host);


// shellExecute(NULL,NULL,"./TTPlayer.exe",NULL,1); 


/*
创建套接字
*/
sockfd = socket(AF_INET, SOCK_STREAM, 0 );

pURL = gethostbyname(host);  
if(pURL == NULL)
{
printf("-----gethostbyname error ----\n");
}
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = *( (unsigned long *)pURL->h_addr );
server_addr.sin_port = htons(80);


//*********************组合http请求包
//------按照http协议的组包格式,注意“空格”的组合


sprintf(header, "%s%s%s%s%s%s%s%s%s%s%s","GET ",url," HTTP/1.1\r\n","Accept: image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*\r\n",
"Accept-Language: zh-CN\r\n","Accept-Encoding: gzip, deflate\r\n","Host: ",host,"\r\nConnection: Keep-Alive\r\n",
"User-Agen: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2\r\n\r\n");
/* strcat(header,"GET ");
strcat(header, url);
strcat(header, " Http/1.1\r\n");


strcat(header, "Host: ");
strcat(header, host);
strcat(header, "Accept-Encoding: gzip,deflate\r\n");
strcat(header, "\r\nConnection: Keep-Alive\r\n\r\n");
*/
printf("----%s\n",header);




//**********************发送请求!!
printf("----222-----------------\n");


err = connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr) );
if(err != 0)
{
printf("-----connect error -----\n");
}


send(sockfd, header, strlen(header), 0 );


printf("=========================1==================\n");


//提前读取一次,读取的是服务器发送的头




p = (char *)malloc( RECV_SIZE*RECV_SIZE );  //申请1M空间大小
start = p;
q = p;


do
{
memset(p, '\0', 1024 );

i = recv(sockfd, recv_buf, RECV_SIZE, 0);
memcpy( p , recv_buf, i );
p = p + i;
// *p = '\0';
printf("-------111111111----------%d\n",i);
}while(i == 1024 );


printf("-------%s",p-i);
/****************************
读取出接受的数据的text的长度
提取出字符串的长度!!
*********************************/
p = cmp(start, "Content-Length: ");
printf("--1111111111111111111111111111111111111111111-%s\n",p);
sscanf(p, "%d", &text_len);
printf("---text_len------%d\n", text_len);



while(sum != text_len )
{
memset(p, '\0', 1024 );

i = recv(sockfd, recv_buf, RECV_SIZE, 0);
memcpy( p , recv_buf, i );
p = p + i;
sum = sum +i;
// *p = '\0';
printf("-------222222222----------%d\n",i);
}


//len  = len - (p - start);
//p = cmp(start, "\r\n\r\n");
printf("--222222222222222222222222222222222222-%s\n",p-text_len);


printf("===================333333333333333333333333=========%d\n",text_len);  //切出文件长度
fwrite(p-text_len, text_len, 1, fp);  //写入文件!!

fclose(fp);  //关闭文件指针
WSACleanup();  //对应初始化



}


int main ()
{
  char url[256];
printf("http://");
gets(url);
printf("-------%s\n",url);
geturl(url);
return 0;


}