關於C語言的下載函數的一些個人見解
#include
#include
#include
struct cfgmain
{
long size;
long Received;
char website[1000]; 想要一起學習C++的可以加裙三四零六五一六八七,裙內有各種資料滿足大家,歡迎加裙
}
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
{
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!
",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!
",threadID,WSAGetLastError());
return;
}
url=url+sizeof(h->h_length)+1;
unsigned int temp;
if(cfg==0)
{
sprintf(bufferSend,"GET /%s HTTP/1.1
Host: %s
Connection: close
",url,h->h_name);
}
else
{
fread(&cfgfile,1,sizeof(cfgmain),cfg);
rewind(cfg);
sprintf(bufferSend,"GET /%s HTTP/1.1
Host: %s
Connection: close
Accept-Range: %d-
",url,h->h_name,cfgfile.Received);
send(sock,bufferSend,strlen(bufferSend),0);
temp=recv(sock,bufferRecv,65535,0);
}
lengthOfWeb=0;
for(lengthOfWeb==0;lengthOfWeb
{
if(url[lengthOfWeb]=="
"&&url[lengthOfWeb+1]=="
"&&url[lengthOfWeb+2]=="
"&&url[lengthOfWeb+3]=="
")
{
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!
");
fclose(fp);
}
}
}
原理是透過http進行傳輸,至於監測http回應的數據的開始位置,我們用循環檢測,一旦檢測到兩個連續的0x0D 0x0A,我們就知道數據重這裡開始。然後進入循環不斷接受,一旦受到的數據包大小為0,證明伺服器已經斷開連接,也就是下載完畢
上述代碼都貼上了,僅供參考!
想要一起學習C++的可以加裙三四零六五一六八七,裙內有各種資料滿足大家,歡迎加裙
※初學C語言的一些注意事項
※C語言C加加從零基礎入門到項目實戰
※C語言基礎——函數基本概念
※c語言中經常使用到的預處理編譯指令,你都知道嗎?
TAG:C加加 |
※c語言 實現一個函數,判斷一個數是不是素數
※世界上使用人數最多的前十種語言
※比開口說另一種語言更難的,是「關掉」原來的語言|PNAS 論文推薦
※中國漢語7大方言,哪種語言使用的人數最多?看看你屬於哪個?
※比開口說另一種語言更難的,是「關掉」原來的語言
※關於c語言中函數的調用的兩種方法
※我一個朋友說的一個故事,這樣的語言你知道嗎?
※瑪雅人五大語言,最後一個是現代人的玩笑,其他四個也另有玄機?
※語言表達能力很強,所以人見人愛的三個星座!
※一個人的路丶不需要太多語言。
※貓的這些肢體語言,你知道幾個?
※幽默一刻:語言不通鬧出的5個「熱」笑話,個個笑翻天!
※傷人最深的永遠是一個人的語言!
※青銅器上最常見的七個字,語言質樸,背後的深意催人淚下
※最後一種語言
※一個真實的「時間旅行者」關於未來的語言
※世界有種人,有六百個部族,說兩百種語言,一名人還認為是印度人
※《四月是你的謊言》一個人有多少真心與他語言無關?我不愛你,但它是個謊言!
※全世界幾千種語言,這個詞的發音幾乎一模一樣!
※C語言字元串相關函數實現