ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

HTTP多线程下载

2021-07-10 11:08:31  阅读:164  来源: 互联网

标签:HTTP nTotleSize nCount start stfile DWORD 1.0 多线程 下载


#include <stdio.h>
#include <windows.h>
#include <wininet.h>
#pragma comment(lib,"wininet.lib")

#define THREADNUM			4
#define BUFLEN				1024

struct stFile{
	DWORD start;
	DWORD len;
	TCHAR url[MAX_PATH];
	TCHAR localfile[MAX_PATH];
};

DWORD nTotleSize=0;
CRITICAL_SECTION criticalsection;

DWORD WINAPI DownloadThread(LPVOID lp){
	stFile *stfile = (stFile*)lp;
	int nCount = stfile->len;
	int nLen = 0;
	int start = stfile->start;
	DWORD readsize = 0;   
	BYTE buffer[BUFLEN] = {0};

	HINTERNET hInternet=InternetOpen(TEXT("RookIE/1.0"),INTERNET_OPEN_TYPE_PRECONFIG,0,0,0);   
	HINTERNET hUrl=InternetOpenUrl(hInternet,stfile->url,0,0,INTERNET_FLAG_RELOAD,0);  
	InternetSetFilePointer(hUrl,start,0,FILE_BEGIN,0); 
	FILE *fp=_tfopen(stfile->localfile,TEXT("rb+")); 
	fseek(fp,start,SEEK_SET); 

	while(TRUE){   
		if(nLen+BUFLEN<=nCount){
			InternetReadFile(hUrl,buffer,BUFLEN,&readsize); 
		}else{
			InternetReadFile(hUrl,buffer,nCount-nLen,&readsize); 
		}
		nLen+=readsize;
		if(readsize==0){   
			break;
		}
		fwrite(buffer,1,readsize,fp); 
		EnterCriticalSection(&criticalsection);
		nTotleSize+=readsize;
		LeaveCriticalSection(&criticalsection);
		Sleep(0);
	}   
	fclose(fp);
	InternetCloseHandle(hUrl);   
	InternetCloseHandle(hInternet); 
	delete stfile;
	return 0;
}

void HttpDownload(TCHAR *szUrl, TCHAR *localfile) {
	DWORD nStart = GetTickCount();
	InitializeCriticalSection(&criticalsection);

	HINTERNET hInternet=InternetOpen(TEXT("RookIE/1.0"),INTERNET_OPEN_TYPE_PRECONFIG,0,0,0);   
	HINTERNET hUrl=InternetOpenUrl(hInternet,szUrl,0,0,INTERNET_FLAG_RELOAD,0);

	DWORD nCount = 0;
	DWORD dwSize = sizeof(nCount);
	HttpQueryInfo(hUrl,HTTP_QUERY_CONTENT_LENGTH| HTTP_QUERY_FLAG_NUMBER,(LPVOID)&nCount,&dwSize,0);

	InternetCloseHandle(hUrl);   
	InternetCloseHandle(hInternet); 

	HANDLE hFile=CreateFile(localfile,GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
	SetFilePointer(hFile,nCount,0,FILE_BEGIN);
	SetEndOfFile(hFile);
	CloseHandle(hFile);

	HANDLE *dThread=new HANDLE[THREADNUM];
	for(int i=0;i<THREADNUM;i++){
		stFile *stfile=new stFile;
		if(THREADNUM>1){
			stfile->len=i<(THREADNUM-1)?nCount/(THREADNUM-1):(nCount-nCount/(THREADNUM-1)*(THREADNUM-1));
			stfile->start=i*(nCount/(THREADNUM-1));
		}else{
			stfile->len=nCount;
			stfile->start=0;
		}
		_tcscpy(stfile->localfile,localfile);
		_tcscpy(stfile->url,szUrl);
		dThread[i]=CreateThread(0,0,DownloadThread,(LPVOID)stfile,0,0);
	}
	while(nTotleSize%nCount!=0 || nTotleSize==0){
		DWORD nTime = GetTickCount()-nStart;
		printf("%3.5f%%, %0.2fKB/s\r\n", nTotleSize*1.0/nCount*100, nTotleSize*1.0/nTime*1000/1024);
		Sleep(1000);
	}
	WaitForMultipleObjects(THREADNUM,dThread,true,-1);
	delete[] dThread;
	DeleteCriticalSection(&criticalsection);

	DWORD nTime = GetTickCount()-nStart;
	printf("%3.5f%%, %0.2fKB/s\r\n", nTotleSize*1.0/nCount*100, nTotleSize*1.0/nTime*1000/1024);
}

 

标签:HTTP,nTotleSize,nCount,start,stfile,DWORD,1.0,多线程,下载
来源: https://blog.51cto.com/u_15298588/3034071

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有