共有回帖数 0 个
-
#includestdio.h
#includeWindows.h
#includememory.h
struct cfgmain
{
long size;
long Received;
char website[1000];
}
int LoadWSA()
{
WSADATA wd;
if(WSAStartup(0x0101,&wd))
{
return -1;
}
return 0;
}
void downThread(char *url,int threadID,int rangeFrom,int rangeUntil,FILE *cfg,FILE *fp)
{
char *oriURL=url;
char *ReadWriteBuf=(char*)malloc(20000);
cfgmain cfgfile;
char bufferSend[65535];
char *bufferRecv=(char*)malloc(65535);
if(strstr(url,"http://"))
{
url=url+sizeof("http://");
}
int lengthOfWeb;
for(lengthOfWeb==0;lengthOfWeb=sizeof(url);lengthOfWeb++)
{
if(url[lengthOfWeb]=='/')
{
break;
}
}
char name[255];
memcpy(name,url,lengthOfWeb);
SOCKET sock=::socket(2,SOCK_STREAM,0);
struct hostent *h;
h=gethostbyname(name);
if(h==0)
{
printf("ThreadID :#%d ERROR:%d The thread will exit!n",threadID,WSAGetLastError());
return;
}
struct sockaddr_in saddr;
memcpy(&saddr.sin_addr,h-h_addr_list,h-h_length);
saddr.sin_port=htons(80);
saddr.sin_family=AF_INET;
if(connect(sock,(sockaddr*)&saddr,sizeof(sockaddr)))
{
printf("ThreadID :#%d ERROR:%d The thread will exit!n",threadID,WSAGetLastError());
return;
}
url=url+sizeof(h-h_length)+1;
unsigned int temp;
if(cfg==0)
{
sprintf(bufferSend,"GET /%s HTTP/1.1rnHost: %srnConnection: closernrn",url,h-h_name);
}
else
{
fread(&cfgfile,1,sizeof(cfgmain),cfg);
rewind(cfg);
sprintf(bufferSend,"GET /%s HTTP/1.1rnHost: %srnConnection: closernAccept-Range: %d-rnrn",url,h-h_name,cfgfile.Received);
send(sock,bufferSend,strlen(bufferSend),0);
temp=recv(sock,bufferRecv,65535,0);
}
lengthOfWeb=0;
for(lengthOfWeb==0;lengthOfWeb=sizeof(bufferRecv);lengthOfWeb++)
{
if(url[lengthOfWeb]=='r'&&url[lengthOfWeb+1]=='n'&&url[lengthOfWeb+2]=='r'&&url[lengthOfWeb+3]=='n')
{
break;
}
}
url=url+3;
char *oribufRecv=bufferRecv;
bufferRecv=bufferRecv+lengthOfWeb;
fwrite(bufferRecv,1,temp-lengthOfWeb,fp);
for(;;)
{
temp=recv(sock,oribufRecv,65535,0);
if(temp=1)
{
fwrite(oribufRecv,1,temp,fp);
}
else
{
printf("Finish Downloading!n");
fclose(fp);
}
}
}
原理是透过http进行传输,至于监测http回应的数据的开始位置,我们用循环检测,一旦检测到两个连续的0x0D 0x0A,我们就知道数据重这里开始。然后进入循环不断接受,一旦受到的数据包大小为0,证明服务器已经断开连接,也就是下载完毕
楼主 2015-11-26 13:47 回复
Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号
意见反馈 |
关于直线 |
版权声明 |
会员须知