HTTP下载(2)

#include <STDIO.H>
#include <WINSOCK2.H>
#include <stdlib.h>

#pragma comment (lib,"ws2_32.lib")
#define BUFLENGHT 1024
#define NAME_LENGHT 50


char fname[NAME_LENGHT]; 

int delete_http_header(SOCKET s,char *strBuffer,int &body_lenght) 
{  //返回当前文件主体的位置
 int end_flag=0;//头结束

 for (int break_flag=0;break_flag==0;)
 { //
  //去除http响应头部
  
  strset(strBuffer,'\0'); 
  // iResult = recv(s,status,sizeof(status),0);
  
  int iResult = recv(s,strBuffer,BUFLENGHT,0);
  if (iResult<=0)
  {  
   iResult=GetLastError();
   break;
  }
  int code = atoi(&strBuffer[8]);
  if (code == 404)
  {
   return -1;
  }
  for (int i=0;(i<BUFLENGHT)&&(break_flag==0);i++)
  {
   if (strBuffer[i]=='C')
   {
    if (strBuffer[i+9]=='e')
    {
     body_lenght=atoi(&strBuffer[i+15]);
    }
   }
   if (end_flag==4)
   {
   return i;
    
   }
   if ((strBuffer[i]=='\r')|| (strBuffer[i]=='\n'))
   {

    end_flag++;
    continue;
    
   }
  
   end_flag=0;
  }
 }

BOOL HttpClient(void) 

 WSADATA ws; 
 SOCKET s; 
 struct sockaddr_in addr; 
 int body_lenght=0;
 int sum=0;
 int iResult; 
 long lResult; 
 char strSubAddr[BUFLENGHT] = {0}; 
 char strBuffer[BUFLENGHT] = {0};  
 
 iResult = WSAStartup( MAKEWORD(2,0),&ws); 
  if(SOCKET_ERROR == iResult) 
 { 
  // 连接失败 
  WSACleanup(); 
  return FALSE; 
 }
  s = socket(AF_INET,SOCK_STREAM,0); 
 addr.sin_family = AF_INET; 
 addr.sin_port = htons(80); 

 HOSTENT *remot;
 remot= gethostbyname("xiazai.xiazaiba.com");//获得域名的ip
 if(remot==NULL)
 {
  DWORD er=GetLastError();
  return -1;
 }
 in_addr pttr;
 memcpy(&pttr,remot->h_addr_list[0],4);//复制域名转换得到的ip到新定义的地址变量中,这是不可或缺的,因为可读性好,且正确
 char *ip=inet_ntoa(pttr);    //将存储顺序修改为net
 addr.sin_addr.s_addr = inet_addr(ip); // 填充ip地址

 iResult=connect(s,(struct sockaddr *) 
  &addr, sizeof(addr)); 

  // 连接成功 
 ////////////////////////////////////////////////////////////////////请求码///

  char   *request  =  
   "GET /Soft/D/DocLibDownload_1.2.0_XiaZaiBa.zip HTTP/1.1 \r\n"
   "Host:xiazai.xiazaiba.com \r\n"//必须包含host其他不一定了
   "Accept: */* \r\n"
   "pragma: no-cache \r\n"
   "Cache-control: no-cache \r\n"
   "Connect:Close \r\n"

   "\r\n";
  strcpy(strSubAddr, "GET /view/pic/2009515164715518.jpg HTTP/1.1 \r\n"); 
   strcpy(fname, "DocLib.zip"); 
  iResult = send(s, request,strlen(request),0); 
  if (iResult<=0)
  {
   iResult=GetLastError();
   return -1;
  }
  // 下载文件 
 
  FILE *fp=fopen(fname,"wb+"); 

  int n_body=delete_http_header(s,strBuffer,body_lenght);//删除协议头
  if (n_body < 0)
  {
   return FALSE;
  }
  char str[BUFLENGHT] = {0};
  memcpy((void*)str, (void*)&strBuffer[n_body], BUFLENGHT-n_body);
  fwrite(&strBuffer[n_body],(BUFLENGHT-n_body),1,fp);
  sum+=BUFLENGHT-n_body;
  int percent=0;
  for (int i=0;;i++)
  {
   if (sum>=body_lenght)
   {
    break;
   }
   memset(&strBuffer,0,sizeof(strBuffer));
   if((iResult = recv(s,strBuffer,BUFLENGHT,0))<=0)
   {
    break;
   }

    
   if(fwrite(&strBuffer,iResult,1,fp)<=0)
   {
    break;
   }
   sum+=iResult;
   if(percent != sum*100/body_lenght)
   {
    percent = sum*100/body_lenght;
    printf("%%d 完成",percent);
   }
   
  }
 
  fclose(fp); 

 WSACleanup(); 
 return TRUE; 
}

你可能感兴趣的:(HTTP下载(2))