服務端是用delphi做的界面和寫的代碼,客戶端只是回應,用的是C++寫客戶端。
下載檔案:
(由于我的代碼是采用的是資料流和訊息異步,貼碼的話,太多,這里我就用口述+重要代碼截圖的方式);
1,建立連接后,先獲取客戶端的磁盤資訊,這里我們給客戶端發送一個命令,比如“PKT_DISK”等類似訊息,在客戶端接受訊息,判斷是接受到的相等命令,我們在客戶端執行相關函式或操作;
這里呼叫函式【GetLogicalDriveStrings】獲取電腦磁盤資訊;然后將獲取到的磁盤資訊send給服務端;


2,在服務端recv到客戶的電腦磁盤資訊后,添加到界面,客戶端的磁盤就已列舉好;

3,獲取磁盤下的目錄,同樣也是send指定命令和想要下載的路徑給客戶端,客戶端recv到相對應命令之后,回應相關代碼,使用函式【FindFirstFile】【FindNextFile】找相關路徑的檔案,需要定義一個WIN32_FIND_DATA結構,回傳給此結構,判斷結構的dwFileAttributes屬性不為“.”和“..”,回圈查找此路徑檔案,然后一一將檔案名,屬性,時間,大小發送給服務端,最后呼叫【FindClose】來關閉打開的句柄;

4,服務端收到檔案名等資訊后,可列舉出此目錄下的所有檔案。

5,有了檔案名之后,我們就可以執行下載命令了,給客戶端發送下載命令,將想要下載的路徑名發給客戶端,客戶端收到訊息之后,使用函式【CreateFile】打開收到的檔案路徑,來判斷是不是一個可以正常打開的檔案,打開成功后,使用函式【GetFileTime】【GetFileAttributes】【GetFileSizeEx】來獲取檔案的時間,屬性,大小等等,獲取成功后,send給服務端。

6,當客戶端確定可以打開后,服務端成功接受到訊息,讀取客戶端發送的檔案屬性,大小,時間,使用函式【CreateFile】來創建檔案,來預接受要下載的資料;創建成功后,給客戶端發送訊息,告訴客戶端,你可以給我發送這個需要下載的檔案的資料了;

7,客戶端呼叫函式【ReadFile】讀取剛才打開的檔案,回圈的發送給服務端,直到讀取的位元組數為0,則呼叫函式【CloseHandle】來關閉句柄,避免泄露句柄;

8,服務端則回圈的recv的客戶端的資料,利用函式【WriteFile】將收到的資料寫入剛才創建的檔案中,直到收到的訊息為結束,則退出回圈;接收完畢后,使用函式【SetFileAttributes】【setfiletime】設定檔案的屬性和時間,使用【CloseHandle】關閉句柄;
至此,下載一個檔案成功 ;

上傳檔案:
1,服務端使用函式【CreatrFIle】打開想要上傳的檔案,利用函式【GetFileTime】【GetFileAttributes】【GetFileSizeEx】獲取檔案的時間, 屬性,大小;將檔案的資訊發送給客戶端;等待接收客戶端是否可以創建檔案的命令;


2,客戶端接受到訊息后,使用函式【CreateFile】創建檔案,創建成功后,發送訊息給服務端,創建檔案成功,可以給我發送需要上傳的資料了;

3,當服務端收到客戶端創建檔案成功后,使用函式【ReadFile】回圈讀取剛才打開的檔案,一一發送資料給客戶端,直到讀取檔案的位元組數為0時,則發送一個完成的命令給客戶端,并使用函式【CloseHandle】關閉句柄;

4,客戶端開啟回圈模式,一直接收服務端發送的資料,然后利用函式【WriteFile】給剛才創建成功的檔案寫入資料,直到收到的命令是完成,則給服務端再send一條命令,告訴服務端,接收上傳的資料成功,使用函式【SetFileTime】設定檔案時間,最后一步使用函式【CloseHandle】【SetFileAttributes】來關閉句柄和設定檔案屬性。

5,服務端這邊再執行一次recv,收到成功后,且沒有錯誤的情況下,至此,上傳檔案完成;

服務端和客戶端的單個檔案的上傳下載就分享到這里;
如果想要下載/上傳多個檔案,則在兩端增加一個變數,用于記錄需要下載的個數,回圈下載/上傳檔案;
如果想要下載一個檔案夾,我采用的方式是比較簡單的遞回演算法,列舉檔案夾內的所有檔案,如果遇到檔案夾再次遞回,最多再呼叫創建檔案夾的函式就可以上傳/下載檔案夾了;
歡迎大家多多探討,多多指導,多多交流;
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/285171.html
標籤:安全技術/病毒
上一篇:百度網盤檔案夾無法洗掉解決方法
