飛鴿傳書檔案傳輸實現原理

2021-04-28 00:46:05 字數 1196 閱讀 3939

開發多年的飛鴿,在他的基礎上增加了些許功能,例如語音對話,這裡繼續討論freeeim飛鴿傳書,前幾天,詳細的了解了freeeim(飛鴿傳書)的網路協議,詳細分析並且實現了freeeim(飛鴿傳書)的訊息傳遞過程,這裡就freeeim(飛鴿傳書)中的檔案和資料夾的傳輸做詳細的說明。

在freeeim(飛鴿傳書)中,如果要進行檔案或者資料夾的傳輸,首先需要做的就是訊息的應答,通過udp傳送檔案傳輸報文,另外的freeeim(飛鴿傳書)客戶端收到報文後,使用tcp協議傳送應答報文,這樣就開始進行檔案的傳輸了。

這裡開啟兩個執行緒,執行緒1負責檔案的傳送,執行緒2負責檔案的接受,下邊做一一說明。

首先,我們知道,可以傳送多個檔案,這些檔案需要建立鍊錶儲存資訊。

typedef struct file_info

file_info;

檔案傳送鍊錶由專門的執行緒維護,這樣,執行緒1就可以專心進行處理檔案傳輸佇列就可以了,執行緒1始終查詢這個鍊錶,如果表頭為null,就說明沒有要傳輸的檔案,表頭非空,就開始傳送報文,獲得正確的應答後,就可以開始檔案的傳輸了,檔案傳輸結束,將相應的鍊錶節點刪除。這裡借鑑了很多程式中使用非常廣泛的「命名池」相關的概念,只不過這裡我們使用的是「檔案池」,可以這麼認為,如果有檔案要傳輸,可以不用考慮是否有檔案正在傳輸,只要把要傳輸的檔案放入 「檔案池」就可以了 , 同時,不用考慮「檔案池」的大小,執行緒1是檔案池的服務執行緒,它檢測檔案池的大小,如果非空,就會逐次傳輸檔案。

這裡需要特別注意的就是關於資料夾的傳輸,這個freeeim(飛鴿傳書)乙個難點,應為對與資料夾的內容是沒有顯示的,需要我們逐次的判斷,在飛鴿傳書中是這麼處理的,如果是乙個資料夾,就傳送檔案屬性為ipmsg_file_dir的資訊包,freeeim(飛鴿傳書)客戶端收到這個資訊包後,就建立這個資料夾,然後發起傳送的freeeim(飛鴿傳書)客戶端,進入資料夾,傳送資料夾內的檔案,如果該資料夾下,還有資料夾,使用相同的方法,在資料夾內的檔案傳送結束後,就傳送freeeim_file_retparent資訊包,接受的freeei_file_retp報文的freeeim(飛鴿傳書)客戶端,執行返回上一級目錄,freeeim(飛鴿傳書)傳送端,就需傳送目錄下的檔案。這樣迴圈操作,最終完成檔案的傳輸,這個過程比較難以理解。

有了上邊的知識,開發檔案傳輸功能就變得簡單多了,檔案的接受也可以類推了,同樣開啟乙個執行緒維護接受檔案鍊錶,逐次接受身下的檔案,鍊錶為空時。檔案傳輸會遇到檔案讀寫問題,有的檔案傳送是被開啟了,這樣會造成訪問違規,所以要有相應的處理,才能讓程式更加穩健。

飛鴿傳書2007 優化的房子原理

談到水泥,就有兩種,但我們一般會認為它們是一種,就是磚塊於磚塊內部之間連線的水泥,還有就是磚塊外部鏈結的水泥。飛鴿傳書2007 www.freeeim.com 中我更傾向於叫它內鏈和外鏈。內鏈的新增一定要合乎規則,不必過多在於精細的將磚塊完美的連線在一起。外鏈的新增也應如此。當我們把地基建好了,磚塊...

IPMsg(飛鴿傳書)檔案傳送原始碼分析

本文分析了飛鴿傳輸核心傳送過程。dword winapitmainwin sendfilethread void sendfileobj else if mainwin sendfilefunc obj true else if obj status fs complete else if sock...

飛鴿傳書談雜湊表之數學原理

net程式設計師,大多數時候是不需要數學的。因為,有了.net,資料結構和演算法的重要性被弱化了,作業系統相關的東西被強化了。程式設計師只要求管理好 而不是設計好演算法。計算機,我只學會了技術,所以很多問題我都感覺似是而非,感覺實在學習乙個api,而不是在學一門科學。最近要實現乙個雜湊表,我查詢了很...