window_socket在vc下的操作(以压缩的形式接受)

来源:互联网 发布:怎样注册淘宝企业店铺 编辑:程序博客网 时间:2024/06/09 22:38

#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;
 
 fp = fopen( "mysocket_test.gzip", "w+" );
 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","http://");
 printf("============000000000000000000===========%s\n",host);


 /*
  创建套接字
 */
 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);
 server_addr.sin_port = htons(80);

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

 sprintf(header, "%s%s%s%s%s%s%s%s","GET ",url," HTTP/1.1\r\n",
       "Accept-Encoding: gzip, deflate\r\n","Host: ",host,"\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;

}

原创粉丝点击