1.引言
在校期間經常需要進行給學委,班長拷貝文件、互傳資料等工作,如果拋開一些聊天工具,如何進行彼此在線主機文件共享呢?帶着種種困惑,瞭解網絡傳輸以及Socket套接字編程、HTTP協議格式、CPP-httplib、分塊傳輸機制等相關技術之後,開始慢慢摸索,不斷試錯,於是乎有了這個項目。
2.項目簡介
環境:Windows10 VS2013 C/C++
- 該項目完成了一個在局域網中進行附近文件共享下載功能的工具
- 能夠進行搜索匹配局域網中運行工具的主機;獲取到局域網在線主機列表;
- 能夠獲取指定主機所共享的文件信息列表(指定的共享目錄下的文件信息);
- 能夠對指定主機上的指定文件進行多進程分塊下載來提高傳輸效率。
3.整體框架
4.服務端設計
服務器端設計:
功能:設計實現HTTP服務端程序,能夠提供瀏覽器客戶端進行文件的下載,獲取文件列表
服務端流程:
①.搭建HTTP服務器
- 1.主機配對請求處理功能
- 2.主機文件列表獲取處理功能
- 3.主機獲取數據獲取功能
②.提供附近主機配對功能
③.向附近主機提供文件列表
④.向附近主機提供文件下載功能
5.客戶端設計
功能:實現基於服務器HTTP的分塊傳輸功能實現多進程文件分塊下載功能的下載器,通過分塊傳輸提高傳輸效率
客戶端流程:
- 1.發現局域網附近共享用戶,獲取局域網中所有的IP地址信息
- 2.向獲取到的IP主機地址發送主機配對請求–獲取到配對成功的主機IP地址列表,打印配對成功的主機列表
- 3.用戶選擇想要獲取哪兒個主機的共享文件
- 4.向指定的這個主機發送文件列表獲取請求 – 獲取到主機上的共享文件列表
- 5.打印所有的文件列表,獲取文件頭部信息,主要獲取文件長度,向指定的主機發送文件數據獲取請求
- 6.若文件過大,則創建多線程進行分塊傳輸下載。
6.主要功能端口
客戶端:
- 提供客戶端的主機配對功能
bool GetonlineHost()
- 提供客戶端的文件列表獲取功能
bool GetShareList(const std::string &host_ip)
- 提供客戶端的文件下載功能(普通下載&&分塊傳輸下載)
//普通下載
bool DownloadFile(const std::string &host_ip, const std::string& filename)
//分塊傳輸下載
bool RangeDownload(const std::string &host_ip, const std::string &filename)
服務端:
- 提供能夠發現匹配局域網附近主機功能
static void HostPair(const httplib::Request &req, httplib::Response &rsp)
- 提供能夠獲取指定主機共享文件列表功能
//獲取共享文件列表,在主機上設置一個共享目錄,凡是這個目錄下的文件都是要給別人共享的
static void ShareList(const httplib::Request &req, httplib::Response &rsp)
- 提供能夠下載指定主機下指定的共享文件功能
static void Download(const httplib::Request &req, httplib::Response &rsp)
其他接口:
httplib基本使用:
1.實例化客戶端對象
httplib::Client cli(buf, P2P_PORT); //實例化httplib客戶端對象
2.實例化服務端對象
httplib::Server _srv;
Windows下獲取網卡信息:
static bool GetAllAdapter(std::vector<Adapter> *list)
7.httplib的處理流程:
搭建客戶端:
1.組織HTTP協議格式請求數據
2.搭建TCP客戶端
3.發送組織好的HTTP請求數據
4.等待服務端響應,接收服務端數據
5.對響應數據進行解析
搭建服務端:
1.搭建一個最簡單的TCP服務器
2.等待接收客戶端發送的數據
3.按照HTTP協議格式,對數據進行解析(請求方法按URL協議版本進行)
4.根據請求的資源路徑以及查詢字符串正文,進行業務描述
5.組織HTTP協議格式的響應,返回給客戶端(協議版本 狀態碼 描述)