姜林美
(華僑大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,福建泉州 362021)
利用W IN 3 2動(dòng)態(tài)鏈接庫(kù)的TFTP服務(wù)器的設(shè)計(jì)與實(shí)現(xiàn)
姜林美
(華僑大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,福建泉州 362021)
為了實(shí)現(xiàn)在設(shè)備相關(guān)的桌面應(yīng)用配置軟件中嵌入簡(jiǎn)單文件傳輸協(xié)議(TFTP)服務(wù)功能,開(kāi)發(fā)針對(duì)嵌入式系統(tǒng)的FLASH燒錄及其配置和文件升級(jí)的接口程序.考慮到軟件復(fù)用的需要,采用W IN 32動(dòng)態(tài)鏈接庫(kù)技術(shù),整個(gè) TFTP服務(wù)模塊僅由一個(gè)動(dòng)態(tài)鏈接庫(kù)文件tftp.dll組成.使用多線程技術(shù),以適應(yīng) TFTP收發(fā)過(guò)程與應(yīng)用程序的其他過(guò)程并發(fā)執(zhí)行的需要.將所述方法應(yīng)用于實(shí)際的路由器配置產(chǎn)品中,并驗(yàn)證其有效性.
簡(jiǎn)單文件傳輸協(xié)議;用戶數(shù)據(jù)包協(xié)議;傳輸控制協(xié)議/因特網(wǎng)互聯(lián)協(xié)議;動(dòng)態(tài)鏈接庫(kù);多線程;文件傳輸;嵌入式系統(tǒng)
簡(jiǎn)單文件傳輸協(xié)議(TFTP)在各類嵌入式產(chǎn)品中應(yīng)用廣泛.在這些嵌入式產(chǎn)品中,主要使用 TFTP來(lái)代替JTAG方式的FLASH燒錄[1-2],以及使用 TFTP實(shí)現(xiàn)軟件或配置的在線更新[3].通常,網(wǎng)絡(luò)服務(wù)器總是在裝有網(wǎng)絡(luò)操作系統(tǒng)(如Unix,Window s 2003等)的專用服務(wù)器設(shè)備中實(shí)現(xiàn),而此種方式具有設(shè)備移動(dòng)不方便,服務(wù)器需要有人值守,以及網(wǎng)絡(luò)服務(wù)安全需要特殊考慮等弊端,故不適用于 TFTP.對(duì)于嵌入式設(shè)備而言,往往需要在設(shè)備和小型桌面應(yīng)用軟件中嵌入 TFTP文件傳輸功能.即使用一個(gè)專用的桌面應(yīng)用配置軟件與設(shè)備進(jìn)行通信,以完成BOOT文件、映像文件或配置文件的傳輸,而不是使用專用的主機(jī)設(shè)備來(lái)充當(dāng)TFTP服務(wù)器的角色.因此,開(kāi)發(fā)一個(gè)通用的TFTP傳輸模塊,以供任意桌面應(yīng)用軟件在需要時(shí)調(diào)用就顯得很有價(jià)值.本文討論在Visual C++2005(VC 2005)環(huán)境下,使用W IN 32動(dòng)態(tài)鏈接庫(kù)[4]實(shí)現(xiàn) TFTP服務(wù)器的一種方法.
1.1 接口
使用兩個(gè)接口ISink和ITftp,來(lái)隔離TFTP服務(wù)器的實(shí)現(xiàn)和使用,其定義如圖1所示.
圖1 接口ISink和ITftp的定義Fig.1 Definitions of interface ISink and ITftp
在C++中,接口的定義是使用結(jié)構(gòu)體加純虛函數(shù)來(lái)完成的.ISink接口由應(yīng)用程序?qū)崿F(xiàn),并被傳遞給DLL.在DLL中,當(dāng)適當(dāng)事件發(fā)生時(shí)就會(huì)調(diào)用接口中相應(yīng)的事件方法.On Tftp RecvOver()方法在文件接收(即上傳)完畢時(shí)被調(diào)用,On Tftp SendOver()方法在文件發(fā)送(即下載)完畢時(shí)被調(diào)用,On Tftp Error()方法則在文件接收或發(fā)送出錯(cuò)時(shí)被調(diào)用.3個(gè)方法的參數(shù)str Ip和strFilename用于指明是哪一個(gè)連接(一個(gè) TFTP服務(wù)器可以同時(shí)與多個(gè)客戶端建立連接)觸發(fā)的事件, On Tftp Error()方法中的參數(shù) iError-Code給出錯(cuò)誤發(fā)生時(shí)的錯(cuò)誤代碼,方便在應(yīng)用程序中對(duì)出錯(cuò)情況進(jìn)行處理.
ITftp接口由DLL實(shí)現(xiàn),是 TFTP服務(wù)器模塊與外層應(yīng)用程序交互的唯一接口.其中:Start()方法用于在參數(shù)uPort指定的端口上啟動(dòng) TFTP服務(wù), Stop()方法則用于停止 TFTP服務(wù)并釋放所有資源;Advise()方法用于建立一個(gè)外層應(yīng)用中實(shí)現(xiàn)的 ISink接口與DLL中TFTP服務(wù)的一個(gè)連接,其唯一參數(shù)pSink用于傳入外層應(yīng)用中實(shí)現(xiàn)的ISink指針;SetRootDir()方法設(shè)置TFTP服務(wù)器文件放置的根目錄,參數(shù)strDir為目錄名.
1.2 TFTP報(bào)文
相應(yīng)于 TFTP報(bào)文格式,采用幾個(gè)數(shù)據(jù)結(jié)構(gòu)來(lái)處理 TFTP報(bào)文,其定義如圖2所示.各個(gè)結(jié)構(gòu)體中的字段含義由各字段后的注釋給出.使用 1個(gè)類CRequests來(lái)管理所有的 TFTP連接,其定義如圖3所示.圖3中:最后一行的TRequest類型使用標(biāo)準(zhǔn)模板庫(kù)中的map容器定義:typedef std::map〈std:: string,TRequest*〉TRequests.
圖2 處理TFTP報(bào)文的數(shù)據(jù)結(jié)構(gòu)注釋Fig.2 Comments of the data strutures for processing TFTP datagrams
圖3 類CRequests的定義Fig.3 Definition of class CRequests
1.3 TFTP實(shí)現(xiàn)類
使用CTftp S類來(lái)具體實(shí)現(xiàn) TFTP服務(wù)器的功能.該類從接口ITftp繼承,實(shí)現(xiàn)聲明的所有方法,其定義如圖4所示.TFTP服務(wù)器實(shí)現(xiàn)代碼均封裝在CTftp S類中,因此該類的實(shí)現(xiàn)主要是ITftp接口聲明的4個(gè)方法的實(shí)現(xiàn).
(1)Start()方法用于啟動(dòng) TFTP服務(wù),進(jìn)行SOCKET庫(kù)的實(shí)始化并創(chuàng)建服務(wù)器端SOCKET,讓其監(jiān)聽(tīng)在指定的端口(默認(rèn)端口號(hào)為69).然后,對(duì)類變量(包括線程同步變量)進(jìn)行初始化.最后,創(chuàng)建TFTP收發(fā)線程,專門負(fù)責(zé) TFTP連接的建立和TFTP報(bào)文的接收與發(fā)送,其入口函數(shù)即CTftp S類的靜態(tài)成員函數(shù)Thread-Func().在創(chuàng)建的線程的時(shí)候,CTftp S類的實(shí)例指針將作為線程的參數(shù)傳入ThreadFunc().
(2)Stop()方法用于停止TFTP服務(wù),要觸發(fā)停止TFTP收發(fā)線程的事件并等待該線程退出,最后釋放所占用的各種資源.另兩個(gè)方法的實(shí)現(xiàn)很簡(jiǎn)單,限于篇幅不贅述.
圖4 CTftpS類的定義Fig.4 Definition of class CTftpS
圖5 TFTP線程函數(shù)處理流程Fig.5 Program flow in TFTP thread function
TFTP服務(wù)實(shí)現(xiàn)的關(guān)鍵在于 TFTP收發(fā)線程函數(shù) Thread Func(),其處理流程圖如圖5所示.在線程函數(shù)中,通過(guò)線程函數(shù)的參數(shù)取得 CTftp S對(duì)象的指針,而這只要通過(guò)對(duì)函數(shù)參數(shù)進(jìn)行一個(gè)類型強(qiáng)制轉(zhuǎn)換即可完成.線程的主循環(huán)具有一個(gè)唯一的退出條件,即退出線程事件(事件句柄為CTftp S::m_hEventEnd Thread)在主線程中被觸發(fā),通過(guò)WINDOWS API函數(shù) Wait For Single Object()可以捕獲該事件.
在線程的主循環(huán)內(nèi),調(diào)用CTftp S:: Elapse Time()方法掃描當(dāng)前已建立的所有用于下載文件的 TFTP連接,比較當(dāng)前時(shí)間與連接記錄(TRequest類型變量)的tm Expiry字段的差值.如果該差值超過(guò)了設(shè)定的超時(shí)時(shí)間(比如3 s),則重發(fā)上一個(gè)數(shù)據(jù)報(bào)文,檢查連接記錄的iA ttemp tTimes字段;而如果該字段的值(重發(fā)次數(shù))大于3,則觸發(fā)ISink接口的On Tftp Error()事件并掛斷連接.
調(diào)用CTftp S::Elapse Time()方法后,繼續(xù)調(diào)用CTftp S::RecvData()方法嘗試接收TFTP報(bào)文.通過(guò)對(duì)收到的有效報(bào)文進(jìn)行解析,把解析結(jié)果保存在一個(gè) TRequest類型變量中,并將該結(jié)果通過(guò)指針類型參數(shù)返回給線程函數(shù).如果通過(guò)CTftp S::RecvData()方法接收到任何有效的 TFTP報(bào)文,則根據(jù)報(bào)文格式的不同分別進(jìn)行處理.
對(duì)于RRQ或WRQ報(bào)文,需要調(diào)用CTftpS::Process New()方法建立一個(gè)新的TFTP連接.建立連接的過(guò)程是:首先從報(bào)文中獲取文件名及模式,在設(shè)定的服務(wù)器根目錄下建立一個(gè)相應(yīng)的文件.其次,對(duì)于RRQ請(qǐng)求需要讀取文件的頭512 B,并將其發(fā)送給客戶端;而對(duì)于WRQ請(qǐng)求,則直接發(fā)送一個(gè)塊號(hào)為零的確認(rèn)報(bào)文.最后,生成一個(gè) TRequest數(shù)據(jù),并將其加入CTftp S::m_requests記錄的連接請(qǐng)求列表中.
對(duì)于DA TA報(bào)文,先判斷該報(bào)文是不是由于超時(shí)重發(fā)而形成的重復(fù)報(bào)文,若是則直接發(fā)回一個(gè)塊號(hào)與所收?qǐng)?bào)文塊號(hào)相同的確認(rèn)報(bào)文;否則,將收到的數(shù)據(jù)寫入服務(wù)器端文件,然后發(fā)回相應(yīng)的確認(rèn)報(bào)文.最后,如果收到的數(shù)據(jù)少于512 B,說(shuō)明已是最后一個(gè)數(shù)據(jù)報(bào)文,文件傳送完畢,觸發(fā)ISink接口的On T-ftp RecvOver()事件,關(guān)閉該 TFTP連接.
對(duì)于ACK報(bào)文,首先判斷塊號(hào)與上一次發(fā)送的數(shù)據(jù)報(bào)文的塊號(hào)是否一致.如果不一致,說(shuō)明是一個(gè)已處理過(guò)的重復(fù)報(bào)文,可忽略該報(bào)文;如果一致,則繼續(xù)判斷上一次發(fā)送的數(shù)據(jù)報(bào)文的數(shù)據(jù)長(zhǎng)度是否小于512 B,小于512 B說(shuō)明已是最后一塊數(shù)據(jù),文件傳送完畢,觸發(fā)ISink接口的On Tftp SendOver()事件,關(guān)閉該TFTP連接.
對(duì)于ERR報(bào)文處理比較簡(jiǎn)單,直接觸發(fā)ISink接口的On Tftp Error()事件并掛斷連接.TFTP線程中調(diào)用的其他CTftpS類的方法的實(shí)現(xiàn)均較為簡(jiǎn)單,比如 TerminateConn()方法用于關(guān)閉連接,其操作就是簡(jiǎn)單地關(guān)閉相應(yīng)的SOCKET,并從CTftp S::m_requests記錄的連接請(qǐng)求列表中刪除該連接對(duì)象.
所討論的TFTP服務(wù)器模塊,最初基于某公司的3G路由器產(chǎn)品的桌面配置軟件而開(kāi)發(fā),并最終應(yīng)用于該產(chǎn)品.實(shí)踐證明,其應(yīng)用方便,用于產(chǎn)品運(yùn)行穩(wěn)定可靠.需要說(shuō)明的是,由于協(xié)議的簡(jiǎn)單性, TFTP沒(méi)有提供任何安全方面的特性[5].
[1]汪小燕,連曉平,黃燕,等.基于TFTP協(xié)議的嵌入式系統(tǒng)開(kāi)發(fā)方法設(shè)計(jì)與實(shí)現(xiàn)[J].華中科技大學(xué)學(xué)報(bào):自然科學(xué)版,2006,34(12):56-58.
[2]李虔華,臧習(xí)飛.TFTP協(xié)議在嵌入式系統(tǒng)中的應(yīng)用[J].電腦與電信,2008(2):40-42.
[3]甘育裕,李婷.在嵌入式Linux中實(shí)現(xiàn) TFTP Server[J].中國(guó)有線電視,2005(Z3):4945-4949.
[4]郭曉鵬,李存斌.Vicsual C++高級(jí)編程及其項(xiàng)目應(yīng)用開(kāi)發(fā)[M].北京:中國(guó)水利水電出版社,2004.
[5]RICHARD SW.TCP/IP Illustrated:Volume 1[M].Boston:Addison Wesley,1995.
(責(zé)任編輯:黃曉楠英文審校:吳逢鐵)
Design and Implementation of TFTP Server Based on WIN 32 Dynamic Link Library
JIANG Lin-mei
(College of Computer Science and Technology,Huaqiao University,Quanzhou 362021,China)
To add a TFTP(trivial file transfer protocol)service to a device-related desktop configuration software,a program interface targeted at the flash burning and configuration upgrade of embeded system s is developed.Considering the requirement of the software reusablity,the W IN 32 DLL(dynamic link library)technology is used and the whole TFTP module is encapsulated in one DLL file(tftp.dll).In addition,to satisfy the requirement of concurrent running of the TFTP process and the other process in an application,the multi-thread technology is used.Finally,the validity is proofed by implementing this scheme in an configuration software of a router product.
trivial file transfer protocol;user datagram protocol;transmission control protocol/internet protocol;dynamic link library;muti-thread;file transfer;embeded system
TP 393.093
A
1000-5013(2011)02-0178-04
2009-09-18
姜林美(1976-),男,講師,主要從事計(jì)算機(jī)網(wǎng)絡(luò)安全及應(yīng)用軟件開(kāi)發(fā)的研究.E-mail:clough@hqu.edu.cn.