複製鏈接
請複製以下鏈接發送給好友

多線程下載

鎖定
線程可以理解為下載的通道,一個線程就是一個文件的下載通道,多線程也就是同時開啓好幾個下載通道。
中文名
多線程下載
原    理
服務器同時與多個用户連接
簡    介
一個線程就是一個文件下載通道
連接服務器
100個線程。

目錄

多線程下載簡介

線程可以理解為下載的通道,一個線程就是一個文件的下載通道,多線程也就是同時開起好幾個下載通道.當服務器提供下載服務時,使用下載者是共享帶寬的,在優先級相同的情況下,總服務器會對總下載線程進行平均分配。不難理解,如果你線程多的話,那下載的越快。現流行的下載軟件都支持多線程。
注意:實現多線程的條件是服務器支持單一IP多線程下載,如果不支持的話,很有可能封IP或者是隻有一個線程能連接成功,多餘線程被屏蔽。部分軟件提供"用代理下載"方式,這種方式不會封IP。

多線程下載原理

多線程下載的原理是這樣的:通常服務器同時與多個用户連接,用户之間共享帶寬。如果N個用户的優先級都相同,那麼每個用户連接到該服務器上的實際帶寬就是服務器帶寬的N分之一。可以想象,如果用户數目較多,則每個用户只能佔有可憐的一點帶寬,下載將會是個漫長的過程。
如果你通過多個線程同時與服務器連接,那麼你就可以榨取到較高的帶寬了。例如原來有10個用户都通過單一線程與服務器相連,服務器的總帶寬假設為56Kbps,則每個用户(每個線程)分到的帶寬是5.6Kbps,即0.7K字節/秒。如果你同時打開兩個線程與服務器連接,那麼共有11個線程與服務器連接,而你獲得的帶寬將是56/11*2=10.2Kbps,約1.27K字節/秒,將近原來的兩倍。你同時打開的線程越多,你所獲取的帶寬就越大(原來是這樣,以後每次我都通過1K個線程連接:P)。當然,這種情況下佔用的機器資源也越多。有些號稱“瘋狂下載”的下載工具甚至可以同時打開100個線程連接服務器

多線程下載實例

自定義 API 線程函數
DWORD WINAPI DownloadThreadProc(LPVOID pParam)
{
CHttpSocket HttpSocket;
// 成功連接服務器,線程結束
//。。。。。
return 1;
}
void XXX::GetDownLoadFile(int nSize, CString strDesPath)
{
int i = 0, iCount = 0;
int iFileSize = nSize; // 獲取文件大小
iCount = iFileSize / (4096); // 分段下載 創建線程
if (iFileSize%(4096))
iCount++;
HANDLE hThread[MAX_THREAD_NUM]; // 線程數
FileDownInfo MyFileDownInfo[MAX_THREAD_NUM];
for(i=0; i<5; i++)
{
hThread[i] = NULL;
}
int iThreadWork = iFileSize / (MAX_THREAD_NUM - 1);
for (i=0 ; i<MAX_THREAD_NUM; i++) // 創建線程
{
MyFileDownInfo[i].iThreadNum = i;
MyFileDownInfo[i].lFromeByte = iThreadWork * i ;
MyFileDownInfo[i].lToByte = iThreadWork * (i + 1) - 1;
if(MyFileDownInfo[i].lToByte >= iFileSize)
{
MyFileDownInfo[i].lToByte = iFileSize;
}
hThread[i] = ::CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)DownloadThreadProc, (VOID*)&MyFileDownInfo[i], NULL, NULL);
if (hThread[i] == NULL)
{
ExitProcess(i);
return ;
}
}
WaitForMultipleObjects(MAX_THREAD_NUM, hThread, TRUE, INFINITE);
for (i = 0; i < MAX_THREAD_NUM; i++)
{
CloseHandle(hThread[i]);
}
}
[1] 
參考資料
  • 1.    許廣博.註冊表和BIOS應用技巧與故障1000例:清華大學出版社,2005:85