當前位置:
首頁 > 知識 > 關於C語言的下載函數的一些個人見解

關於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語言基礎——函數基本概念
c語言中經常使用到的預處理編譯指令,你都知道嗎?

TAG:C加加 |

您可能感興趣

c語言 實現一個函數,判斷一個數是不是素數
世界上使用人數最多的前十種語言
比開口說另一種語言更難的,是「關掉」原來的語言|PNAS 論文推薦
中國漢語7大方言,哪種語言使用的人數最多?看看你屬於哪個?
比開口說另一種語言更難的,是「關掉」原來的語言
關於c語言中函數的調用的兩種方法
我一個朋友說的一個故事,這樣的語言你知道嗎?
瑪雅人五大語言,最後一個是現代人的玩笑,其他四個也另有玄機?
語言表達能力很強,所以人見人愛的三個星座!
一個人的路丶不需要太多語言。
貓的這些肢體語言,你知道幾個?
幽默一刻:語言不通鬧出的5個「熱」笑話,個個笑翻天!
傷人最深的永遠是一個人的語言!
青銅器上最常見的七個字,語言質樸,背後的深意催人淚下
最後一種語言
一個真實的「時間旅行者」關於未來的語言
世界有種人,有六百個部族,說兩百種語言,一名人還認為是印度人
《四月是你的謊言》一個人有多少真心與他語言無關?我不愛你,但它是個謊言!
全世界幾千種語言,這個詞的發音幾乎一模一樣!
C語言字元串相關函數實現