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)
{
returni;

}
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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值