飞鸽传书文件传输实现原理
飛鴿傳書文件傳輸實現原理,企業即時通訊軟件飛鴿傳書,是一款基于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(飛鴿傳書)客戶端,執行返回上一級目錄,發送端,就需發送目錄下的文件。這樣循環操作,最終完成文件的傳輸,這個過程比較難以理解。
有了上邊的知識,開發文件傳輸功能就變得簡單多了,文件的接受也可以類推了,同樣開啟一個線程維護接受文件鏈表,逐次接受身下的文件,鏈表為空時。文件傳輸會遇到文件讀寫問題,有的文件發送是被打開了,飛鴿傳書這樣會造成訪問違規,所以要有相應的處理,才能讓程序更加穩健。
總結
以上是生活随笔為你收集整理的飞鸽传书文件传输实现原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 闲记(一)
- 下一篇: 飞秋下载2010正式版_飞秋下载