⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 geohttpdown.cpp

📁 类似flashget下载工具代码 本来想在完善了上传的
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	//格式化http
	CString host,Ref;
    host = GetHostName(the->m_DownInfo->strLocationUrl.GetBuffer(1),strObject.GetBuffer(1));
		   the->m_DownInfo->strLocationUrl.ReleaseBuffer();
    Ref = getRefererName(the->m_DownInfo->strLocationUrl.GetBuffer(1));
		
    pRequestHeader = HttpSocket.FormatRequestHeader((LPTSTR)(LPCTSTR)host,
		             (LPTSTR)(LPCTSTR)curl,nLength,NULL,(LPTSTR)(LPCTSTR)Ref,
					 the->m_DownInfo->lFromeByte,the->m_DownInfo->lToByte,
					 0,NULL);
					 
	   
	
   // }
	CGeoHttpDown::t.out(pRequestHeader);	
	HttpSocket.Socket();
    
    if(is_proxy)
	   HttpSocket.Connect((LPTSTR)(LPCTSTR)Proxy->ProxyAddr ,Proxy->port);
    else
       HttpSocket.Connect((LPTSTR)(LPCTSTR)strServer,nPort);
   
	HttpSocket.SendRequest();
	HttpSocket.SetTimeout(500,0);
	pResponseHeader=HttpSocket.GetResponseCharPoint();
	CGeoHttpDown::t.out(pResponseHeader);	

	int nLineSize = 0;
	char szLine[256];

     LPTestSrvLog LPlog = NULL;
     while(nLineSize != -1)
	 {  
		static long num =1; 
		nLineSize = HttpSocket.GetResponseLine(szLine,256);
		if(nLineSize > -1)
		{
			szLine[nLineSize] = '\0';
			CString log = szLine;
			LPlog = new TestSrvLog;
			LPlog->Num = num;
            LPlog->log = log; 
			::SendMessage(pFrm->m_Logworkspace.m_hWnd,WM_SETTESTSERVER,0,(LPARAM)LPlog);
		    
		}
		num++;
	}
   
	
	int nSvrState = HttpSocket.GetServerState();
	the->m_DownInfo->nSvrState=nSvrState;

	CString csState;
	csState.Format("%d",nSvrState);
	csState=csState.Left(1);
	if(csState=="3")
	{
		//重新定位下载网址,退出,在测试新网子
		char szValue[30];
		HttpSocket.GetField("Location",szValue,30);
		the->m_DownInfo->strLocationUrl.Format("%s",szValue);
		AfxParseURL((LPCTSTR)(the->m_DownInfo->strLocationUrl),dwServiceType,strServer,strObject,nPort);
		if(strServer.IsEmpty())
		{
			CString strLocation;
			strLocation="http://";
			strLocation+=the->m_DownInfo->stSocketType.strServer;
			strLocation+=the->m_DownInfo->strLocationUrl;
			the->m_DownInfo->strLocationUrl=strLocation;  
            first = TRUE;
		    


		}
	}
	else if(csState=="5")
	{
	}
	else if(csState=="2")
	{   
	
		//成功连接服务器,线程结束
		char szLength[30];
		HttpSocket.GetField("Content-Length",szLength,30);
		long nFileSize = atol(szLength);
		the->m_DownInfo->lFileLength=nFileSize;	
        SetEvent(CGeoHttpDown::m_handle);
	}
    

	HttpSocket.CloseSocket();
	AfxEndThread(0,TRUE);
	return 0;
}

UINT HttpDown(LPVOID lParam)
{
    LPDOWN_INFO DownInfo=(LPDOWN_INFO)lParam;
	CWnd *pMainFrame=(CWnd*)DownInfo->pMainFrame;
	CMainFrame* pFrm = NULL;
	if(pMainFrame->IsKindOf(RUNTIME_CLASS(CMainFrame)))
	{
	   pFrm = (CMainFrame*)pMainFrame;
	}
   
	//判断是否是代理下载
    LPProxyInfo Proxy = pFrm->m_default_proxy;
    bool is_proxy = false;
	if(Proxy!=NULL)
	   is_proxy = true; //使用代理下载

    //下在缓存
	UINT m_CacheSize = CSetupRegister::Instance()->m_cache;
	CGeoHttpDown *pHttpDL=(CGeoHttpDown*)DownInfo->the;
	pHttpDL->m_stHttpDlInfo.lFileLength = DownInfo->lFileLength;//文件长度
    CString strServer,strObject;
	DWORD dwServiceType;
	DWORD dwStartTime,dwEndTime,dwTime;
	BOOL  bIsStartTime=FALSE;
	const char *pRequestHeader = NULL;
	char *pResponseHeader=NULL;
	char *pAcceptType=NULL;
	unsigned short nPort;
	
	int nTimeout= 500;
	long nLength;
	long lRevLength=0;
	long lSizeLength=1024;
	int  nSocketLinkNum=1;
	//开始的字节数
	long nCompletedSize = DownInfo->lBreakPointByte;  
	//结束的字节数
	long nFileSize=DownInfo->lToByte;                 
	long CompleOffset=nCompletedSize;                   
	int  nBreakRev=DownInfo->nBreakRev;
	
	//下在文件路局
	CString strFileName=DownInfo->strFilePath;
	LPCTSTR strLocatea=(LPCTSTR)DownInfo->strLocationUrl;
	CString sRegPath=DownInfo->strRegSubPath;
	int nPID=DownInfo->nPID;
	int nCID=DownInfo->nCID;
	long length = DownInfo->lFileLength;
    

    CFile DownloadFile; 
	double fSpeed;
	CString SCID;
	SCID.Format("%d",nCID);
	CString BREAK = "BREAKPOINT" + SCID;

    if(!DownloadFile.Open((LPCTSTR)strFileName,CFile::modeWrite|CFile::shareDenyNone))
	{
	    return -1;
	  
	}
	if(nCID==0)
	{
		pHttpDL->m_stHttpDlInfo.BreakInfo0.nCID=DownInfo->nCID;
		pHttpDL->m_stHttpDlInfo.BreakInfo0.lFromeByte=nCompletedSize;
		pHttpDL->m_stHttpDlInfo.BreakInfo0.lToByte=nFileSize;

		
		//开始位置
        pHttpDL->m_stHttpDlInfo.CFG->CFG_SetInt("BREAKPOINT0",nCompletedSize);
		//结束位置
		pHttpDL->m_stHttpDlInfo.CFG->CFG_SetInt("LENGTH0",nFileSize);
		
	
	}
	else if(nCID==1)
	{
		pHttpDL->m_stHttpDlInfo.BreakInfo1.nCID=DownInfo->nCID;
		pHttpDL->m_stHttpDlInfo.BreakInfo1.lFromeByte=nCompletedSize;
		pHttpDL->m_stHttpDlInfo.BreakInfo1.lToByte=nFileSize;

		//开始位置
        pHttpDL->m_stHttpDlInfo.CFG->CFG_SetInt("BREAKPOINT1",nCompletedSize);
		//结束位置
		pHttpDL->m_stHttpDlInfo.CFG->CFG_SetInt("LENGTH1",nFileSize);
	

	}
	else if(nCID==2)
	{
		pHttpDL->m_stHttpDlInfo.BreakInfo2.nCID=DownInfo->nCID;
		pHttpDL->m_stHttpDlInfo.BreakInfo2.lFromeByte=nCompletedSize;
		pHttpDL->m_stHttpDlInfo.BreakInfo2.lToByte=nFileSize;

		//开始位置
        pHttpDL->m_stHttpDlInfo.CFG->CFG_SetInt("BREAKPOINT2",nCompletedSize);
		//结束位置
		pHttpDL->m_stHttpDlInfo.CFG->CFG_SetInt("LENGTH2",nFileSize);
	

	}
	else if(nCID==3)
	{
		pHttpDL->m_stHttpDlInfo.BreakInfo3.nCID=DownInfo->nCID;
		pHttpDL->m_stHttpDlInfo.BreakInfo3.lFromeByte=nCompletedSize;
		pHttpDL->m_stHttpDlInfo.BreakInfo3.lToByte=nFileSize;

		//开始位置
        pHttpDL->m_stHttpDlInfo.CFG->CFG_SetInt("BREAKPOINT3",nCompletedSize);
		//结束位置
		pHttpDL->m_stHttpDlInfo.CFG->CFG_SetInt("LENGTH3",nFileSize);
	

	}
	else if(nCID==4)
	{
		pHttpDL->m_stHttpDlInfo.BreakInfo4.nCID=DownInfo->nCID;
		pHttpDL->m_stHttpDlInfo.BreakInfo4.lFromeByte=nCompletedSize;
		pHttpDL->m_stHttpDlInfo.BreakInfo4.lToByte=nFileSize;

		//开始位置
        pHttpDL->m_stHttpDlInfo.CFG->CFG_SetInt("BREAKPOINT4",nCompletedSize);
		//结束位置
		pHttpDL->m_stHttpDlInfo.CFG->CFG_SetInt("LENGTH4",nFileSize);
	
	
	}
    
    while(nCompletedSize < nFileSize)
	{
                    

        nSocketLinkNum++;
		AfxParseURL(strLocatea,dwServiceType,strServer,strObject,nPort);  //分解网址
		//http://www.xxx.xxx/xx/xxx/x.zip
		//strServer=www.xxx.xxx,strObject=/xx/xxx/x.zip,nPort=端口
		CHttpSocket HttpSocket;
		//开始格式化Socket头

		CString host,Ref;
        host = GetHostName(DownInfo->strLocationUrl.GetBuffer(1),strObject.GetBuffer(1));
		DownInfo->strLocationUrl.ReleaseBuffer();
		Ref = getRefererName(DownInfo->strLocationUrl.GetBuffer(1));
		
		pRequestHeader = HttpSocket.FormatRequestHeader((LPTSTR)(LPCTSTR)host,
		             (LPTSTR)(LPCTSTR)DownInfo->strLocationUrl,nLength,NULL,
					 (LPTSTR)(LPCTSTR)Ref,nCompletedSize,nFileSize,
					 0,NULL);



		HttpSocket.CloseSocket();                              //关闭Socket,防止以前打开过
		HttpSocket.Socket();                                   //初始化Socket
		
		//连接代理
        if(is_proxy)
		HttpSocket.Connect((LPTSTR)(LPCTSTR)Proxy->ProxyAddr,Proxy->port);  //代理连接
		else
		HttpSocket.Connect((LPTSTR)(LPCTSTR)strServer,nPort);  //直接连接
		
		
		HttpSocket.SendRequest();                              //向服务器发送请求信息
		HttpSocket.SetTimeout(nTimeout,0);                     //设置连接超时
		pResponseHeader=HttpSocket.GetResponseCharPoint();     //返回服务器的回应信息
		CGeoHttpDown::t.out(pResponseHeader);
		int nSvrState = HttpSocket.GetServerState();           //获得服务器的状态值
		DownInfo->nSvrState=nSvrState;
		CString csState;
		csState.Format("%d",nSvrState);
		csState=csState.Left(1);
		if(csState=="2")
		{    

		

			//连接成功,向列表控件发送服务器回应信息
			
			int nLineSize = 0;
			char szLine[256];
			LPTestSrvLog LPLog = NULL;
			CString log;
			while(nLineSize != -1)
			{
				nLineSize = HttpSocket.GetResponseLine(szLine,256);
				if(nLineSize > -1)
				{
					szLine[nLineSize] = '\0';
					LPLog = new TestSrvLog;
					LPLog->Num = DownInfo->nCID;
					log = szLine;
					LPLog->log = log;
					::SendMessage(pFrm->m_Logworkspace.m_hWnd,WM_SETTHREADLOG,0,(LPARAM)LPLog);
				}
			}			
           
		}
        
		    //用于存放接收数据的字符数组
		    char pData[1024];    
		    //实际接收数据的长度(服务器返回来的值)
		    long nReceSize = 0;
			DownloadFile.Seek(DownInfo->lBreakPointByte,CFile::begin);  //设置文件指针位置
		   
			if(!bIsStartTime)
			{
				dwStartTime = GetTickCount();  //1:用于下载速率
				bIsStartTime=TRUE;             //2:用于下载速率
			}

			while(nCompletedSize < nFileSize)
			{   
			
                WaitForSingleObject(pHttpDL->m_stHttpDlInfo.m_HandleStop,INFINITE);
                //判断还剩余多少字节没有下栽
				if(nFileSize-nCompletedSize<1024)
				{
				
				   char* pData = new char[nFileSize-nCompletedSize];
                   nReceSize = HttpSocket.Receive(pData,nFileSize-nCompletedSize);
				   dwEndTime = GetTickCount();                //3:用于下载速率
				   if(nReceSize<=0)
				   {
					HttpSocket.CloseSocket();                 //没有可以接收的数据,关闭Socket      
				
					break;                                    //return while(TRUE)  !!!
				   }
				   
				
				   DownloadFile.Write(pData,nReceSize);  //如果接收成功,开始向文件当前位置写入数据
				   
				   nCompletedSize += nReceSize;            //累计已经下载的数据(用于判断是否等于要下载文件的长度,如果等于证明下载结束)
				   lRevLength+=nReceSize;				   //4:用于下载速率
				   
                   DownInfo->lBreakPointByte=nCompletedSize;  //!!!保存此子线程已经下载的字节数(用于下次下载的开始位置)
				   //5:用于下载速率
				   dwTime=dwEndTime-dwStartTime;
				   if(dwTime==0)
					  dwTime=10;
				   fSpeed = 0.0f;
				   fSpeed=(double)lRevLength;
				   fSpeed = fSpeed/(((double)dwTime)/1000.0f);
				   DownInfo->fSpeed=fSpeed;
				}
				else
				{
					

				nReceSize = HttpSocket.Receive(pData,1024);   //!!!开始从服务器接收数据
			
				dwEndTime = GetTickCount();                   //3:用于下载速率
				if(nReceSize<=0)
				{
					HttpSocket.CloseSocket();                 //没有可以接收的数据,关闭Socket      
				    break;                                    //return while(TRUE)  !!!
				}
			    
				//将数据写入缓存
				DownloadFile.Write(pData,nReceSize);          //如果接收成功,开始向文件当前位置写入数据
			    
				nCompletedSize += nReceSize;                  //累计已经下载的数据(用于判断是否等于要下载文件的长度,如果等于证明下载结束)
				lRevLength+=nReceSize;						  //4:用于下载速率
                
				
				DownInfo->lBreakPointByte=nCompletedSize;  //!!!保存此子线程已经下载的字节数(用于下次下载的开始位置)
                //保存短点位置
				pHttpDL->m_stHttpDlInfo.CFG->CFG_SetInt(BREAK,DownInfo->lBreakPointByte);
				//实际下载字节数
				 //5:用于下载速率
				dwTime=dwEndTime-dwStartTime;
				if(dwTime==0)
				   dwTime=10;
				   fSpeed = 0.0f;
				   fSpeed=(double)lRevLength;
				   fSpeed = fSpeed/(((double)dwTime)/1000.0f);
				   DownInfo->fSpeed=fSpeed;
			
				}
			    //6:用于下载速率,存入当前的子线程中
				if(nCID==0)
				{
					pHttpDL->m_stHttpDlInfo.BreakInfo0.BreakLength0=DownInfo->lBreakPointByte;
					pHttpDL->m_stHttpDlInfo.BreakInfo0.lSpeed0=fSpeed;

				}
				else if(nCID==1)
				{
					pHttpDL->m_stHttpDlInfo.BreakInfo1.BreakLength1=DownInfo->lBreakPointByte;
					pHttpDL->m_stHttpDlInfo.BreakInfo1.lSpeed1=fSpeed;
				}
				else if(nCID==2)
				{
					pHttpDL->m_stHttpDlInfo.BreakInfo2.BreakLength2=DownInfo->lBreakPointByte;
					pHttpDL->m_stHttpDlInfo.BreakInfo2.lSpeed2=fSpeed;
				}
				else if(nCID==3)
				{
					pHttpDL->m_stHttpDlInfo.BreakInfo3.BreakLength3=DownInfo->lBreakPointByte;
					pHttpDL->m_stHttpDlInfo.BreakInfo3.lSpeed3=fSpeed;

				}
				else if(nCID==4)
				{
					pHttpDL->m_stHttpDlInfo.BreakInfo4.BreakLength4=DownInfo->lBreakPointByte;
					pHttpDL->m_stHttpDlInfo.BreakInfo4.lSpeed4=fSpeed;
				}
			} //while

   }
    DownloadFile.Close();
	
	LPTestSrvLog LPLog = new TestSrvLog;
	LPLog->Num = DownInfo->nCID;

	CString ttt;
	ttt.Format("%d",DownInfo->nCID);
	LPLog->log =ttt +"下载完毕";
	CGeoHttpDown::t.out(LPLog->log);
    ::SendMessage(pFrm->m_Logworkspace.m_hWnd,WM_SETTHREADLOG,0,(LPARAM)LPLog);
	DownInfo->bIsFileDown = FALSE;
	return 0;
}

CString CGeoHttpDown::GetFileName(const CString& url)
{

    int pos;
	CString Name;
    pos = url.ReverseFind('/');
    Name = url.Mid(pos+1,url.GetLength());
    return Name;
}
void CGeoHttpDown::BeginTimer(UINT nIDEvent)
{
	SetTimer(nIDEvent,1000,NULL);

}
void CGeoHttpDown::StopTimer(UINT nIDEvent)
{
	KillTimer(nIDEvent);
}

void CGeoHttpDown::OnTimer(UINT nIDEvent)
{
    switch(nIDEvent)
	{
	case 1:
		{
	
		m_usetime.nSS=m_usetime.nSS+1;
		if(m_usetime.nSS>=59)
		{
			m_usetime.nSS=0;
			m_usetime.nMM+=1;
			if(m_usetime.nMM>=59)
			{
				m_usetime.nMM=0;
				m_usetime.nHH+=1;
			}
		}
		//格式化
        char sz[9];
		CString ssz;
		FormatTime(m_usetime.nHH,m_usetime.nMM,m_usetime.nSS,sz); //排列计时器格式	
        ssz = sz;
        LPINSERTLISTlog LPLog = new INSERTLISTlog;
		LPLog->m_nitem = m_DownInfo->nPID;
		LPLog->nSubItem = 4;
        LPLog->m_Log = ssz;
		m_pView->SendMessage(WM_SETLISTLOG,0,(LPARAM)LPLog);
		//保存时间
	    m_stHttpDlInfo.CFG->CFG_SetString("USETIME",ssz);
		}
		
		break;
	    case 2:
		   {
		  
        if(!m_DownInfo->nBreakRev)
		{
		//设置下载百分比和速率
		long FileLength=m_DownInfo->lFileLength;   //文件总长度
		long BreakLength0,BreakLength1,BreakLength2,BreakLength3,BreakLength4;  //5个子线程已经下载完的字节数
		long nCompletedSize;  //已经下载完的总字节数
	    //long nCompletedSize;  //已经下载完的总字节数
		long dwPercent,dwCompleted;  //已完的百分比,已经下载完的总字节数
		long mmSpeed;  //每秒下载的字节数(xxkb/s)
		CString sTemp;
		if(FileLength>0L)
		  {
			long LOffet=FileLength/5L;
	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -