青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

C++樂園

C/C++ 交流

  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
  12 隨筆 :: 18 文章 :: 14 評論 :: 0 Trackbacks
 ftp下載的好處我在這里就不多說了,許多工程會把ftp下載作為一個重要的功能來實現。微軟提供的WinInet類可以利用下面這些函數:

  InternetOpen;
  InternetConnect;
  GetCurrentDirectory;
  SetCurrentDirectory;
  FtpGetFile;

  很容易實現ftp的下載,網上關于這方面的文章也很多。但是要實現ftp的多線程下載,利用這些函數就顯得有些牽強了。用socket根據ftp協議來開發將會變的十分靈活。下面我就逐步的講解整個開發的過程:開發環境 BCB(組件模式),VC 環境下請自行稍作改動??戳诉@篇文章后對于BCB開發人員來說,不僅可以對 FlashGet 等軟件的開發原理有一定的了解,特別是在開發組件方面也有很大的指導作用,請耐心的將它看完。很簡單??!

  首先介紹一下部分ftp協議:

圖一 FTP服務示意圖

  用戶FTP和服務器FTP之間要傳送文件,需要有兩個連接:命令通道和數據連接,從名字上就可以看出命令通道是傳送命令的,數據通道是用于傳送文件。服務器與服務器之間的數據傳送在此就不多作解釋。
主要用到的命令為:USER,PASS,TYPE,SIZE,REST,CWD,PWD,RETR,PASV,PORT,QUIT;

  USER:參數是標記用戶的Telnet串。用戶標記是訪問服務器必須的,此命令通常是控制連接后第一個發出的命令,有些主機還會要求口令和帳戶。服務器可以在任何時間接收新的USER命令以改變訪問控制和(或)帳戶信息。這可以重新開始登錄過程,所以傳輸參數不變,在進行中的文件傳輸在過去的訪問控制參數下完成。
PASS:參數是標記用戶口令的Telnet串。此命令緊跟USER命令,在某些站點它是完成訪問控制不可缺少的一步。因此口令是個重要的東西,因此不能顯示出來,服務器方沒有辦法隱藏口令,所以這一任務得由用戶FTP進程完成。

  TYPE:參數指定表示類型。有些類型需要第二個參數,第一個參數由單個Telnet字符定義,第二個參數是十進制整數指定字節大小,參數間以<SP>分隔。下面是格式:

圖二 TYPE參數示意圖

  默認表示類型是ASCII非打印字符,如果參數未改變,以后只改變了第一個參數,則使用默認值。

  SIZE:參數從FTP服務器上返回指定文件的大小。

  REST:參數域代表服務器要重新開始的那一點,此命令并不傳送文件,而是略過指定點后的數據,此命令后應該跟其它要求文件傳輸的FTP命令。

  CWD:此命令使用戶可以在不同的目錄或數據集下工作而不用改變它的登錄或帳戶信息。傳輸參數也不變。參數一般是目錄名或與系統相關的文件集合。

  PWD:改變當前的工作目錄。

  RETR:開始傳送指定的文件。(從REST參數指定的偏移量開始傳送)

  PASV:此命令要求服務器DTP在指定的數據端口偵聽,進入被動接收請求的狀態,參數是主機和端口地址。

  PORT:參數是要使用的數據連接端口,通常情況下對此不需要命令響應。如果使用此命令時,要發送32位的IP地址和16位的TCP端口號。上面的信息以8位為一組,逗號間隔十進制傳輸。

  QUIT:退出登錄。
各個參數的具體用法舉例如下:

USER sandy \r\n //用戶名為sandy登錄
PASS sandy \r\n //密碼為sandy
TYPE I \r\n
SIZE sandy.txt \r\n //如果sandy.txt文件存在,則返回該文件的大小
REST 100 \r\n //重新指定文件傳送的偏移
CWD infor/ \r\n //獲取當前的工作目錄
PWD temp/ \r\n //改變當前的工作目錄
RETR \r\n //開始傳送文件
PASV \r\n //進入被動模式
PORT h1,h2,h3,h4,p1,p2 \r\n //進入主動模式,h1,h2,h3,h4為ip地址的4個部分。p1,p2是16進制的端口號


  下面介紹一下各個函數的使用順序和一些應注意的地方:

  使用這些命令的前提條件是客戶端和服務器端建立了連接。比如ftp服務器地址:192.168.1.81 ,端口:21。那么利用Winsock的API函數建立socket連接,然后使用USER,PASS登陸FTP服務器.需要下載文件,要確保文件必須在當前工作目錄下,可以使用命令CWD和PWD。查看和更改當前的工作目錄。使用SIZE命令獲取文件的大小。我們想要多線程下載那么就要求服務器支持該功能。一般我們都會在開頭先使用REST命令判斷該ftp站點是否支持多線程下載。PORT和PASV兩個命令是用來建立數據連接的。他們的主要區別是:PORT需要你指定一個ip地址和端口與服務器建立連接。PASV命令服務器會返回h1,h2,h3,h4,p1,p2樣式 的數據供客戶端連接。等數據連接建立后,就可以了使用REST,RETR進行多線程和斷點續傳文件下載了。

  上面講解了一點ftp下載的基本知識,下面主要介紹的是斷點續傳的文件保存技巧。

  若要講斷點續傳的文件保存方式至少可以說出10種,但是各種方法都有利有弊,下面主要介紹一種我在工作中常常使用的一種文件保存方式:比如要下載一個364544字節的文件,文件名為:namelock.avi。因為要斷點續傳,所以 在下載的過程中必須得保存文件的大小,已經下載的文件的大小和各個線程的任務。

  有兩種方法:

  一、可以產生兩個文件:內容文件和配置文件。

  二、只需一個文件:把配置文件的數據加載到內容文件的末尾。

  這兩個都不失為好方法。我使用的是前一種,因為我水平有限,(對于臨界資源的訪問總是不能做到互坼,老出問題。)。這里 的后綴名希望大家要把它放在心上,后綴名是個象征性的東西。就拿我們公司來說,擁有自己的MPEG編碼、解碼技術,比如原來5m的一首mp3歌曲,通過編碼可以 轉換成500K左右的.fun文件(funinhand的前三個字)。再利用我們自己的解碼播放器邊下載邊解碼邊播放, 音質和mp3不相上下。真正實現了手機上的流媒體技術。受到國內外高科技大公司的信賴。(不好意思,這里有點像做廣告了。)講這些的另外一個企圖是這樣的:

  內容文件所使用的后綴名是我女朋友的英文名(namelock)的前三個字母.nam 。配置文件使用的是我自己的英文名(sandy)的前三個字母.san 。所以說寫程序也可以很浪漫,因為這,女朋友又給了我的月生活零用錢增加了幾元,哈哈(大家也可以效仿)。言歸正傳,這兩個文件嚴格意義上來講是臨時文件,當文件下載完畢的時候,namelock.avi.nam內容文件應該改名為:namelock.avi。namelock.avi.san配置文件也應該及時的刪除。
FTP多線程下載技術部分:前面我介紹了文件的保存技巧,主要也是為了多線程服務?,F在有個namelock.avi文件需要下載。文件的大小為:364544字節。要用8個下載線程。 第一步:將namelock.avi文件分成8個子模塊。這里要注意的地方是我所說的分成8個字模塊,并不是把文件的內容分別存放到8個不同的緩沖區里。而是生成8個不同的文件偏移量。很多時候程序員為了偷懶往往容易一次性講文件讀入內存,這樣帶來的后果是不堪設想的。一個比較理想的方法是這樣的。

bool DealFile(string fileName) //隨便寫個函數說明
{
FILE *file;
DWORD fileSize ,pos;
int readLen ;

//MAX_BUFFER_LEN 在頭文件里定義,這里能夠保證數據不丟失,也不至于內存逸出
char *buffer = new char[MAX_BUFFER_LEN];
file = fopen(fileName.c_str(),"r+b");
  if(file == NULL) return false;
fseek(file,0,2);
fileSize = ftell(file); //取得文件的大小
fseek(file,0,0);
do{
readLen = fread(buffer,sizeof(char),MAX_BUFFER_LEN,file);
if(readLen > 0)
{
pos += readLen;
//對讀取的文件做處理
}
}while(pos < fileSize); //循環讀取文件
 delete[] buffer;
fclose(file); //釋放資源
return true;

}


  8個線程下載文件時,都要對內容文件和配置文件進行讀寫。這樣如果沒有處理好,很有可能會造成訪問文件失敗,我定義了一個全局變量FileLocked,如果FileLocked=true說明文件正在被某個線程訪問。所以使用Sleep(10)睡眠等待。當某個線程進入讀寫文件時必須設置FileLocked = true;訪問文件完畢必須將FileLocked = false;這樣就能很好的控制各個線程對文件的訪問了。(對臨界資源的訪問有API提供了很多很好的解決方法,請查閱)。

  8個下載線程同時下載文件時,完成部分下載是隨機的。那么怎么樣把隨機的文件數據按照偏移量正確的寫入文件呢?我是這樣實現的,當要下載文件namelock.avi時,首先查找文件namelock.avi.san配置文件是否存在。如果存在,說明上次已經下載過部分該文件,就可以斷點續傳了。如果沒有找到該文件,那么生成和該文件的大小一樣大的文件,文件里所有的數據都為0,(可以使用函數memset(buffer,10000,''0''))和一個配置文件。然后利用fseek函數將數據正確的覆蓋原先的0;接下來要介紹一寫配置文件的格式了。

  很簡單,配置文件的內容主要包括:文件在本地保存的絕對路徑、文件的大小、線程的個數、已經下載的文件大小,各個線程的任務(在原始文件起始位置和結束位置,中間使用''-''分開);如:

D:\mm\namelock.avi //文件保存在這里
364544 //文件大小
5 //有5個線程在下載
0 //已經下載了0字節
0-72908 //線程1的下載任務
72908-145816 //線程2的下載任務
145816-218724 //線程3的下載任務
218724-291632 //線程4的下載任務
291632-364544 //線程5的下載任務


  以上是開始下載時的各個線程的任務分配。

D:\mm\namelock.avi
364544
5
113868
72908-72908
113868-145816
145816-218724
218724-291632
291632-364544


  以上是某一時刻各個線程的任務分配情況。

  各個線程任務分配是這樣實現的。在開始下載時,文件平均分成若干塊進行下載。如第一個線程一開始的任務是從文件的0位置開始下載一直到72908位置處。線程1每次下載一塊數據后就要調整任務,如第一次下載了20800字節的數據,那么線程1的任務將改為:20800-72908。如此下去,直到任務為72908-72908時表示線程1完成了當前的下載任務。此時,線程1就分析各個線程的任務,找出任務最為繁忙的一個線程:如線程3:14816-218724。那么線程1就自動去調整任務,拿50%的任務來再次下載。周而復始直到各個線程都完成任務。不過這里有一點需要注意:為了避免重復下載部分數據,在調整任務的時候,起始的文件便移量必須加上接受緩沖器的字節數,因為如前面所舉的列子來看。線程1和線程3在平衡負載的時候,線程正在下載數據,如果所剩的數據比接受緩沖器的大小還小,線程1和線程3的部分下載數據將會重復。

  在調整任務和分析任務的時候,會發現一個問題。就是讀取文件數據太過頻繁。于是我用了一個數據結構。在下載文件的過程中始終打開配置文件,這樣速度提高了很多。在文件下載完畢后關閉文件。數據結構如下:

typedef struct FromToImpl{
DWORD from; //任務起始位置
DWORD to; //任務結束位置
}m_fromTo;
typedef struct InfroImpl{
String fileLoad; //文件保存位置
DWORD fileSize; //文件大小
int threadCnt; //下載線程數
DWORD alreadyDownloadCnt; //已經下載的文件大小
FromToImpl *fromToImpl; //各個線程的任務描述
}m_inforImpl;

posted on 2006-12-09 18:19 小不懂^_^ 閱讀(556) 評論(0)  編輯 收藏 引用

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美日韩国产va另类| 美女精品在线| 欧美午夜宅男影院在线观看| 免费视频久久| 欧美—级高清免费播放| 亚洲日韩中文字幕在线播放| 日韩午夜一区| 欧美va天堂| 一本色道久久综合狠狠躁篇怎么玩 | 最新中文字幕亚洲| 在线观看日韩www视频免费| 欧美在线视频播放| 欧美激情精品| 欧美岛国激情| 久久国产精品72免费观看| 午夜精品美女久久久久av福利| 欧美日韩国产成人在线91| 欧美精品一区二区三区在线看午夜| 一区二区三区毛片| 亚洲女与黑人做爰| 亚洲激情国产| 国产精品三级久久久久久电影| 久久精品国产精品亚洲综合| 亚洲精品免费在线| 亚洲视频在线观看| 亚洲电影毛片| 美女免费视频一区| 美女精品自拍一二三四| 欧美三区免费完整视频在线观看| 欧美黄色一级视频| 麻豆视频一区二区| 欧美三级免费| 激情欧美丁香| 永久免费精品影视网站| 99国产精品自拍| 久久免费视频观看| 亚洲欧美日韩一区二区在线| 99精品视频免费在线观看| 午夜视频在线观看一区| 午夜精品区一区二区三| 美乳少妇欧美精品| 中文av字幕一区| 亚洲一区精品视频| 夜夜嗨av一区二区三区四区| 日韩视频精品| 亚洲美女色禁图| 久久亚洲色图| 嫩模写真一区二区三区三州| 国产色综合久久| 国产亚洲免费的视频看| 国产美女精品一区二区三区| 国产精品成人播放| 国产精品一区在线观看| 一区二区三区四区蜜桃| 日韩亚洲一区二区| 欧美成人免费视频| 91久久精品日日躁夜夜躁国产| 国内视频一区| 99精品福利视频| 亚洲尤物在线视频观看| 欧美高清视频一二三区| 国内精品99| 欧美成人自拍| 欧美黑人国产人伦爽爽爽| 在线观看视频亚洲| 久久精品一区二区三区不卡| 亚洲视频欧洲视频| 亚洲永久视频| 久久亚洲影院| 亚洲美女黄网| 性伦欧美刺激片在线观看| 香蕉av777xxx色综合一区| 国产精品一区三区| 欧美一区二区三区在线看| 蜜臀av性久久久久蜜臀aⅴ四虎 | 国产精品亚洲综合| 性色av一区二区三区| 欧美~级网站不卡| 99ri日韩精品视频| 久久人人精品| 久久精品亚洲精品国产欧美kt∨| 久久久综合香蕉尹人综合网| 欧美日韩久久久久久| 国产一区二区在线观看免费| 久久久久久久综合日本| 久热精品视频在线| 国产精品区二区三区日本| 性色一区二区三区| 免费91麻豆精品国产自产在线观看| 亚洲美女啪啪| 欧美91视频| 欧美日韩一区在线| 久久一区二区三区四区五区| 男女激情视频一区| 欧美一区综合| 欧美精品v国产精品v日韩精品 | 一本色道久久99精品综合| 久久精品99无色码中文字幕| 日韩亚洲一区二区| 国产亚洲综合性久久久影院| 亚洲高清一区二| 国产精品夜夜夜一区二区三区尤| 久久字幕精品一区| 国产精品xxxxx| 欧美大胆成人| 国产丝袜一区二区三区| 久久九九热re6这里有精品| 新片速递亚洲合集欧美合集| 欧美亚州一区二区三区| 国产精品99久久不卡二区| 一区二区欧美视频| 国产一区二区日韩精品| 免费一级欧美片在线播放| 欧美日韩播放| 久久精品国产69国产精品亚洲 | 欧美激情视频网站| 亚欧成人在线| 欧美顶级少妇做爰| 久久精品欧洲| 国产精品久久国产愉拍| 91久久精品国产91久久性色tv| 国产精品久久久久aaaa| 亚洲三级免费| 最新国产成人在线观看| 久久精品72免费观看| 亚洲手机在线| 欧美精品v日韩精品v韩国精品v| 久久久久久久久久久成人| 国产精品久久久久久模特| 亚洲一区二区精品| 亚洲国产高清aⅴ视频| 亚洲欧美bt| 欧美国产在线观看| 欧美大片va欧美在线播放| 激情自拍一区| 久久久国产午夜精品| 久久久久久久久久久久久女国产乱| 国产精品高潮呻吟视频| 日韩亚洲一区二区| 一区二区日韩| 欧美视频在线看| 国产精品99久久久久久久vr| 在线视频精品一区| 欧美视频手机在线| 一区二区三区高清在线观看| 亚洲无吗在线| 亚洲欧美文学| 欧美一区二区三区四区夜夜大片| 欧美日韩一区二区在线视频| 洋洋av久久久久久久一区| 在线亚洲精品福利网址导航| 欧美日韩成人在线观看| 艳妇臀荡乳欲伦亚洲一区| 亚洲一区二区在线| 国产精品激情偷乱一区二区∴| 欧美日韩中文在线观看| 国产视频一区在线观看| 久久成人精品电影| 欧美成人精品高清在线播放| 亚洲激情视频网| 欧美久久电影| 午夜精品视频网站| 免费日韩一区二区| 在线视频中文亚洲| 国产一区二区久久| 欧美国产日韩在线观看| 亚洲欧美美女| 亚洲欧美综合v| 麻豆av福利av久久av| 欧美成人免费小视频| 亚洲精品少妇网址| 久久国产免费| 亚洲电影免费在线观看| 亚洲香蕉成视频在线观看| 亚洲欧美视频在线| 狠狠狠色丁香婷婷综合久久五月| 夜夜爽www精品| 久久精品72免费观看| 亚洲欧洲一区二区三区| 国产精品国产三级国产普通话三级 | 欧美日韩情趣电影| 亚洲欧美区自拍先锋| 亚洲国产裸拍裸体视频在线观看乱了中文| 欧美国产激情| 性久久久久久久久久久久| 亚洲国产精品一区二区尤物区| 亚洲在线成人精品| 曰韩精品一区二区| 国产精品高潮呻吟久久| 女人香蕉久久**毛片精品| 午夜精品一区二区三区在线视 | 欧美在线免费观看亚洲| 久久精品99无色码中文字幕 | 中文亚洲欧美| 在线观看一区| 国产一区二区三区四区| 国产精品福利av| 欧美日韩国产一区精品一区| 久久手机免费观看| 久久超碰97中文字幕|