亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? downloadpub.cpp

?? ◆◆◆ 《FTP、HTTP 多線程斷點續傳下載文件》◆◆◆ FlashGet、網絡螞蟻想必大家都很熟悉
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
// DownloadPub.cpp: implementation of the CDownloadPub class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "NetDownMTR.h"
#include "DownloadPub.h"
// for PathFindExtension () / PathFindFileName ()
#include "Shlwapi.h"
#pragma comment ( lib, "shlwapi.lib" )

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

// 下載數據保存的臨時緩沖大小
#define TEMP_SAVE_BUFFER_SIZE		(10*NET_BUFFER_SIZE)
// 當下載的數據達到這個數的時候才保存到文件中
#define WRITE_TEMP_SAVE_MIN_BYTES	(TEMP_SAVE_BUFFER_SIZE / 2)

void DownloadNotify ( int nIndex, UINT nNotityType, LPVOID lpNotifyData, LPVOID pDownloadMTR );

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CDownloadPub::CDownloadPub()
{
	m_hThread					= NULL;
	m_TimeLastModified			= -1;
	m_csDownloadUrl				= _T("");
	m_csSaveFileName				= _T("");

	m_Proc_SaveDownloadInfo		= NULL;
	m_wSaveDownloadInfo_Param	= NULL;

	m_bSupportResume			= FALSE;
	m_nFileTotalSize			= -1;
	m_csReferer					= _T("");
	m_csUserAgent				= _T("XieHongWei-HttpDown/2.0");
	m_csUsername				= _T("");
	m_csPassword				= _T("");
	m_csProtocolType			= "http";
	m_csServer					= _T("");
	m_csObject					= _T("");
	m_csFileName				= _T("");
	m_nPort						= DEFAULT_HTTP_PORT ;
	m_nIndex					= -1;
	ResetVar ();
	m_hEvtEndModule = ::CreateEvent ( NULL, TRUE, FALSE, NULL );
	m_pDownloadMTR				= NULL;
}

void CDownloadPub::ResetVar()
{
	Clear_Thread_Handle ();
	m_nWillDownloadStartPos		= 0;
	m_nWillDownloadSize			= -1;
	m_nDownloadedSize			= 0;
	m_nTempSaveBytes			= 0;
	m_bDownloadSuccess			= FALSE;
}

CDownloadPub::~CDownloadPub()
{
	StopDownload ();
	Clear_Thread_Handle ();
}

void CDownloadPub::StopDownload ()
{
	if ( HANDLE_IS_VALID(m_hEvtEndModule) )
	{
		::SetEvent ( m_hEvtEndModule );
		WaitForThreadEnd ( m_hThread,30*1000 );
		CLOSE_HANDLE ( m_hEvtEndModule );
		m_hEvtEndModule = NULL;
		Clear_Thread_Handle ();
	}
}

//
// 設置認證信息
//
void CDownloadPub::SetAuthorization ( LPCTSTR lpszUsername, LPCTSTR lpszPassword )
{
	if( lpszUsername != NULL )
	{
		m_csUsername	 = GET_SAFE_STRING(lpszUsername);
		m_csPassword	 = GET_SAFE_STRING(lpszPassword);
	}
	else
	{
		m_csUsername	 = _T("");
		m_csPassword	 = _T("");
	}
}

// 設置Referer
void CDownloadPub::SetReferer(LPCTSTR lpszReferer)
{
	if( lpszReferer != NULL )
		m_csReferer = lpszReferer;
	else
		m_csReferer = _T("");
}

// 設置UserAgent
void CDownloadPub::SetUserAgent(LPCTSTR lpszUserAgent)
{
	m_csUserAgent = lpszUserAgent;	
	if( m_csUserAgent.IsEmpty())
		m_csUserAgent = _T("XieHongWei-HttpDown/2.0");
}

//
// 設置保存下載信息回調函數
//
void CDownloadPub::Set_SaveDownloadInfo_Callback ( FUNC_SaveDownloadInfo Proc_SaveDownloadInfo, WPARAM wParam )
{
	m_Proc_SaveDownloadInfo = Proc_SaveDownloadInfo;
	m_wSaveDownloadInfo_Param = wParam;
}

//
// 下載任務的線程函數
//
DWORD WINAPI ThreadProc_Download(
  LPVOID lpParameter   // thread data
)
{
	CDownloadPub *pDownloadPub = (CDownloadPub*)lpParameter;
	ASSERT ( pDownloadPub );
	return pDownloadPub->ThreadProc_Download ();
}

BOOL CDownloadPub::ThreadProc_Download()
{
	for ( int i=0; i<RETRY_TIMES; i++ )
	{
		if ( DownloadOnce () )
			return DownloadEnd(TRUE);
		SLEEP_RETURN_Down ( 5*1000 );
	}

	return DownloadEnd(FALSE);
}

BOOL CDownloadPub::DownloadOnce()
{
	// 打開文件
	if ( !OpenFileForSave () )
		return FALSE;

	// 連接到服務器
	if ( !m_SocketClient.Is_Connected () )
	{
		if ( !Connect () )
			return FALSE;
	}

	return TRUE;
}

//
// 創建線程下載文件
//
BOOL CDownloadPub::Download (
		int nWillDownloadStartPos,		// 要下載文件的開始位置
		int nWillDownloadSize,			// 本次需要下載的大小,-1表示一直下載到文件尾
		int nDownloadedSize				// 已下載的字節數,指完全寫到文件中的字節數
	)
{
	// 設置下載參數
	m_nWillDownloadStartPos	= nWillDownloadStartPos;
	Set_WillDownloadSize ( nWillDownloadSize );
	if ( m_nFileTotalSize > 0 && Get_WillDownloadSize() > m_nFileTotalSize )
	{
		Set_WillDownloadSize ( m_nFileTotalSize );
	}
	Set_DownloadedSize ( nDownloadedSize );

	// 創建一個下載線程
	DWORD dwThreadId = 0;
	m_hThread = CreateThread ( NULL, 0, ::ThreadProc_Download, LPVOID(this), 0, &dwThreadId );
	if ( !HANDLE_IS_VALID(m_hThread) )
	{
		Log ( L_WARNING, "Create download thread failed" );
		return FALSE;
	}
	return TRUE;
}

//
// 下載結束
//
BOOL CDownloadPub::DownloadEnd(BOOL bRes)
{
	m_bDownloadSuccess = bRes;
	m_SocketClient.Disconnect ();
	if ( HANDLE_IS_VALID ( m_file.m_hFile ) )
	{
		m_file.Close ();
	}

	TRACE ( "=============== 線程。%d 下載 %s 結束\n", m_nIndex, bRes?"成功":"!!! 失敗 !!!" );

	return bRes;
}

BOOL CDownloadPub::Connect()
{
	if ( !HANDLE_IS_VALID(m_hEvtEndModule) )
		return FALSE;

	if ( m_csServer.IsEmpty() )
	{
		Log ( L_WARNING, "Please set download URL" );
		return FALSE;
	}
	m_SocketClient.SetEventOfEndModule ( m_hEvtEndModule );
	// 連接到服務器
	if ( !m_SocketClient.Connect ( m_csServer, m_nPort ) )
		return FALSE;
	TRACE ( "對象.%d 連接到服務器 成功\n", m_nIndex );

	return TRUE;
}

BOOL CDownloadPub::SetDownloadUrl(LPCTSTR lpszDownloadUrl)
{
	if ( !lpszDownloadUrl ) return FALSE;
	m_csDownloadUrl		= lpszDownloadUrl;
	// 檢驗要下載的URL是否為空
	m_csDownloadUrl.TrimLeft();
	m_csDownloadUrl.TrimRight();
	if( m_csDownloadUrl.IsEmpty() )
		return FALSE;
	// 檢驗要下載的URL是否有效
	if ( !ParseURL(m_csDownloadUrl, m_csServer, m_csObject, m_nPort, m_csProtocolType))
	{
		TRACE(_T("Failed to parse the URL: %s\n"), m_csDownloadUrl);
		return FALSE;
	}

	return TRUE;
}

//
// 從服務器接收數據并保存到文件中
//
BOOL CDownloadPub::RecvDataAndSaveToFile(CSocketClient &SocketClient,char *szTailData/*=NULL*/, int nTailSize/*=0*/)
{
	int nDownloadedSize = Get_DownloadedSize();
	if ( szTailData && nTailSize > 0 )
	{
		nDownloadedSize = SaveDataToFile ( szTailData, nTailSize );
		if ( nDownloadedSize < 0 )
		{
			return FALSE;
		}
	}

	char szRecvBuf[NET_BUFFER_SIZE] = {0}, *szTempSaveBuf = new char[TEMP_SAVE_BUFFER_SIZE];
	if ( !szTempSaveBuf )
	{
		Log ( L_ERROR, "Allocate memory failed" );
		return FALSE;
	}
	m_nTempSaveBytes = 0;

	while ( TRUE )
	{
		BOOL bDownloadFinished = FALSE;
		int nReadSize = 0;
		int nTempSaveBytes = Get_TempSaveBytes ();
		int nRecvTotalBytes = nDownloadedSize+nTempSaveBytes;	// 保存在文件中的字節數加上臨時緩沖中的字節數就是總共接收到字節數
		int nWillDownloadSize = Get_WillDownloadSize ();
		// 從字節數判斷,本次下載已經完成了
		if ( nWillDownloadSize > 0 && nRecvTotalBytes >= nWillDownloadSize )
		{
			bDownloadFinished = TRUE;
		}
		else
		{
			int nRecvBytesThisTimes = sizeof(szRecvBuf);
			if ( nWillDownloadSize > 0 )
				nRecvBytesThisTimes = nWillDownloadSize - nRecvTotalBytes;
			ASSERT ( nRecvBytesThisTimes >= 0 );
			nRecvBytesThisTimes = MIN ( nRecvBytesThisTimes, sizeof(szRecvBuf) );
			nReadSize = SocketClient.Receive ( szRecvBuf, nRecvBytesThisTimes );
			// 讀不到數據了,所以認為下載已經完成
			if ( nReadSize <= 0 )
			{
				if ( nWillDownloadSize <= 0 )
				{
					bDownloadFinished = TRUE;
				}
			}
			else
			{
//				TRACE ( "對象.%d, 收到 %d 字節,我的任務是 %d (0x%08x)字節\n",
//					m_nIndex, nReadSize, nWillDownloadSize , nWillDownloadSize );
			}
		}

		// 先將數據保存到臨時緩沖中
		if ( nReadSize > 0 )
		{
			nReadSize = MIN ( nReadSize, TEMP_SAVE_BUFFER_SIZE-nTempSaveBytes );
			memcpy ( szTempSaveBuf+nTempSaveBytes, szRecvBuf, nReadSize );
			nTempSaveBytes += nReadSize;
			ASSERT ( nTempSaveBytes < TEMP_SAVE_BUFFER_SIZE );
		}
		// 當下載已完成或者收到的數據超過一定數量時才保存到文件中
		if ( bDownloadFinished || nTempSaveBytes >= WRITE_TEMP_SAVE_MIN_BYTES )
		{
			// 保存文件失敗,下載也應該終止
			nDownloadedSize = SaveDataToFile ( szTempSaveBuf, nTempSaveBytes );
			if ( nDownloadedSize < 0 )
			{
				break;
			}
			nTempSaveBytes = 0;
		}
		Set_TempSaveBytes ( nTempSaveBytes );

		if ( bDownloadFinished )
		{
			ASSERT ( (nWillDownloadSize > 0 && nDownloadedSize >= nWillDownloadSize) || (nReadSize <= 0 && nWillDownloadSize <= 0) );
			break;
		}
		
		SLEEP_BREAK ( 1 );
	}

	if ( szTempSaveBuf ) delete[] szTempSaveBuf;
	szTempSaveBuf = NULL;

	BOOL bRes = FALSE;
	int nWillDownloadSize = Get_WillDownloadSize ();
	if ( nWillDownloadSize != -1 )
	{
		if ( nDownloadedSize >= nWillDownloadSize )
			bRes = TRUE;
	}
	else if ( nDownloadedSize > 0 )
	{
		bRes = TRUE;
	}
	
	return bRes;
}

int CDownloadPub::SaveDataToFile(char *data, int size)
{
	ASSERT ( HANDLE_IS_VALID ( m_file.m_hFile ) );
	if ( !data || size < 0 )
		return -1;

	int nDownloadedSize = -1;
	// 保存下載的數據
	ASSERT ( HANDLE_IS_VALID(m_file.m_hFile) );
	BOOL bRet = TRUE;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产女人水真多18毛片18精品视频| 欧美电影在线免费观看| 久久精品99国产国产精| 亚洲大片精品永久免费| 亚洲一区免费视频| 日韩精品一级中文字幕精品视频免费观看| 亚洲精品福利视频网站| 亚洲男人都懂的| 亚洲综合激情小说| 午夜精品久久久久久不卡8050| 亚洲自拍偷拍网站| 日韩精品欧美成人高清一区二区| 亚洲成人av一区二区| 免费成人在线观看视频| 精品一区二区综合| 国产91露脸合集magnet| 91在线观看地址| 欧美日韩精品一区二区在线播放 | 国产成人亚洲综合a∨婷婷图片| 午夜精品视频在线观看| 青青草97国产精品免费观看无弹窗版| 亚洲国产另类av| 免费人成精品欧美精品| 国产电影精品久久禁18| 99国产精品99久久久久久| 欧美亚洲一区二区在线| 884aa四虎影成人精品一区| 精品区一区二区| 中文字幕日韩av资源站| 亚洲一本大道在线| 老色鬼精品视频在线观看播放| 国产乱妇无码大片在线观看| 91丝袜美腿高跟国产极品老师 | 久久女同精品一区二区| 国产精品毛片久久久久久| 亚洲成在线观看| av电影一区二区| 日韩一区二区电影在线| 中文字幕欧美一区| 久久99久久99精品免视看婷婷| 不卡在线视频中文字幕| 日韩精品资源二区在线| 亚洲精品乱码久久久久久日本蜜臀| 日韩高清一区在线| 91伊人久久大香线蕉| 久久久美女毛片| 亚洲va韩国va欧美va精品| 高清国产午夜精品久久久久久| 欧美日韩国产不卡| 亚洲婷婷综合久久一本伊一区| 免费精品视频在线| 欧美日韩亚洲另类| 亚洲精品视频一区二区| 成人免费视频网站在线观看| 日韩欧美中文字幕制服| 亚洲一区二区影院| 成人av综合一区| 久久久蜜臀国产一区二区| 美女高潮久久久| 欧美日韩免费观看一区二区三区 | 国产一区欧美日韩| 6080午夜不卡| 亚洲成人av中文| 色猫猫国产区一区二在线视频| 国产午夜久久久久| 国产大片一区二区| 亚洲精品一线二线三线| 麻豆国产精品777777在线| 欧美日韩国产综合视频在线观看| 亚洲欧美日韩久久| 99re热视频这里只精品| 国产日韩欧美综合在线| 国产成人在线免费| 国产日韩在线不卡| 国产美女一区二区三区| 亚洲精品在线免费播放| 精品一区二区三区不卡| 久久综合给合久久狠狠狠97色69| 麻豆精品视频在线观看视频| 欧美一区二区福利在线| 久久激情综合网| 精品国产伦理网| 高清国产一区二区| 亚洲日本电影在线| 欧美日韩在线电影| 视频一区视频二区中文字幕| 51精品视频一区二区三区| 日韩国产欧美在线观看| 日韩欧美电影一区| 国产一区视频网站| 国产精品久久免费看| 日本高清不卡视频| 日韩黄色免费电影| 精品久久久久99| 成人av手机在线观看| 亚洲私人黄色宅男| 91精品国产综合久久香蕉的特点 | 亚洲免费色视频| 欧美三级资源在线| 青草av.久久免费一区| 337p粉嫩大胆色噜噜噜噜亚洲 | 久久草av在线| 国产欧美精品一区二区三区四区 | 亚洲成人在线观看视频| 日韩一级片在线播放| 成人福利视频网站| 亚洲国产精品久久久久婷婷884 | 中文字幕一区在线| 欧美日韩电影一区| 国产成人av在线影院| 亚洲成人综合网站| 国产精品亲子伦对白| 欧美午夜精品久久久久久超碰 | 色婷婷av一区二区三区gif| 日韩成人午夜精品| 中文字幕va一区二区三区| 欧美高清一级片在线| 99久久夜色精品国产网站| 久久精品国产秦先生| 亚洲欧美日韩在线不卡| 精品裸体舞一区二区三区| 色先锋aa成人| 国产91露脸合集magnet | 综合av第一页| 欧美成人三级电影在线| 一本一道综合狠狠老| 国产寡妇亲子伦一区二区| 亚洲va欧美va人人爽| 自拍偷拍国产精品| 国产亚洲精品福利| 欧美白人最猛性xxxxx69交| 在线精品亚洲一区二区不卡| 国产精品一二三| 免费观看一级特黄欧美大片| 一区二区三区国产| 亚洲国产精品激情在线观看| 91精品国产美女浴室洗澡无遮挡| 一本久道久久综合中文字幕| 国产成人精品在线看| 久久99国产精品尤物| 日韩精品亚洲专区| 亚洲图片欧美色图| 亚洲最新在线观看| 亚洲图片你懂的| 亚洲天堂2014| 亚洲三级电影网站| 中文字幕日本不卡| 亚洲日本护士毛茸茸| 国产精品久久久久9999吃药| 国产女人aaa级久久久级 | 欧美日韩精品一区二区天天拍小说 | 欧美成人一区二区三区在线观看 | 97aⅴ精品视频一二三区| 成人性生交大合| 成人高清视频在线观看| 99精品视频在线播放观看| 99在线精品一区二区三区| jizzjizzjizz欧美| 99国产精品国产精品久久| 在线免费av一区| 欧美三级欧美一级| 欧美一区二区视频网站| 日韩欧美国产一二三区| 26uuu亚洲| 国产精品午夜免费| 亚洲精品久久久蜜桃| 亚洲午夜精品17c| 免播放器亚洲一区| 国产suv一区二区三区88区| 成+人+亚洲+综合天堂| 欧美在线看片a免费观看| 欧美电影在线免费观看| 亚洲精品一区二区在线观看| 国产欧美日韩不卡免费| 亚洲欧洲中文日韩久久av乱码| 亚洲va欧美va人人爽| 激情都市一区二区| www.亚洲在线| 69堂成人精品免费视频| 欧美国产一区视频在线观看| 亚洲欧美日韩国产手机在线| 日本视频一区二区三区| 国产黄色精品网站| 欧美亚洲国产一区在线观看网站 | 国产成人福利片| 在线一区二区三区做爰视频网站| 7777精品伊人久久久大香线蕉超级流畅 | 2023国产精品自拍| 日韩理论片在线| 老司机免费视频一区二区三区| youjizz久久| 日韩午夜激情免费电影| 亚洲色图制服诱惑 | 欧美久久久一区| 国产精品网站一区| 卡一卡二国产精品| av日韩在线网站| 26uuu国产在线精品一区二区| 亚洲激情五月婷婷| 国产精品1024|