天天看點

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

飛鴿傳書檔案傳輸實作原理,企業即時通訊軟體飛鴿傳書,是一款基于TCP/IP協定、基于區域網路廣播消息模式的通訊軟體,适合企業或政府部門區域網路内部使用。飛鴿傳書使用者可在企業内部或外部通過該軟體進行工作上的交流,軟體支援消息發送、檔案傳輸、語音對話等。支援統一的使用者管理,并且通訊記錄可儲存于伺服器,查詢友善。為您提供安全,穩定的即時通訊解決方案。

此文由飛鴿傳書于2009-5-12釋出,已有1140人閱讀。開發多年的飛鴿,在他的基礎上增加了些許功能,例如語音對話,這裡繼續讨論FreeEIM(飛鴿傳書),前幾天,詳細的了解了FreeEIM(飛鴿傳書)的網絡協定,詳細分析并且實作了FreeEIM(飛鴿傳書)的消息傳遞過程,這裡就FreeEIM(飛鴿傳書)中的檔案和檔案夾的傳輸做詳細的說明。

在FreeEIM(飛鴿傳書)中,如果要進行檔案或者檔案夾的傳輸,首先需要做的就是消息的應答,通過UDP發送檔案傳輸封包,另外的FreeEIM(飛鴿傳書)用戶端收到封包後,使用TCP協定發送應答封包,這樣就開始進行檔案的傳輸了。

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

首先,我們知道,可以發送多個檔案,這些檔案需要建立連結清單儲存資訊。

typedef struct file_info

{

    struct file_info *next; //雙向連結清單

    struct file_info *forward;

    char *file;  //檔案名

    int type;  //檔案類型:檔案或者檔案夾

    int size;  //檔案大小

    struct sockaddr_in addr;  //目标網絡資訊

} FILE_INFO;

檔案傳送連結清單由專門的線程維護,這樣,線程1就可以專心進行處理檔案傳輸隊列就可以了,線程1始終查詢這個連結清單,如果表頭為NULL,就說明沒有要傳輸的檔案,表頭非空,就開始發送封包,獲得正确的應答後,就可以開始檔案的傳輸了,檔案傳輸結束,将相應的連結清單節點删除。這裡借鑒了很多程式中使用非常廣泛的“命名池”相關的概念,隻不過這裡我們使用的是“檔案池”,可以這麼認為,如果有檔案要傳輸,可以不用考慮是否有檔案正在傳輸,隻要把要傳輸的檔案放入 “檔案池”就可以了 , 同時,不用考慮“檔案池”的大小,線程1是檔案池的服務線程,它檢測檔案池的大小,如果非空,就會逐次傳輸檔案。

這裡需要特别注意的就是關于檔案夾的傳輸,這個FreeEIM(飛鴿傳書)一個難點,應為對與檔案夾的内容是沒有顯示的,需要我們逐次的判斷,在飛鴿傳書中是這麼處理的,如果是一個檔案夾,就發送檔案屬性為IPMSG_FILE_DIR的資訊包,FreeEIM(飛鴿傳書)用戶端收到這個資訊包後,就建立這個檔案夾,然後發起發送的FreeEIM(飛鴿傳書)用戶端,進入檔案夾,傳送檔案夾内的檔案,如果該檔案夾下,還有檔案夾,使用相同的方法,在檔案夾内的檔案傳送結束後,就發送FREEEIM_FILE_RETPARENT資訊包,接受的FREEEI_FILE_RETP封包的FreeEIM(飛鴿傳書)用戶端,執行傳回上一級目錄,發送端,就需發送目錄下的檔案。這樣循環操作,最終完成檔案的傳輸,這個過程比較難以了解。

有了上邊的知識,開發檔案傳輸功能就變得簡單多了,檔案的接受也可以類推了,同樣開啟一個線程維護接受檔案連結清單,逐次接受身下的檔案,連結清單為空時。檔案傳輸會遇到檔案讀寫問題,有的檔案發送是被打開了,飛鴿傳書這樣會造成通路違規,是以要有相應的處理,才能讓程式更加穩健。

繼續閱讀