




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、優(yōu)秀目錄1. 引言12. tcp/ip協(xié)議概述13. tcp/ip協(xié)議的系統(tǒng)設(shè)計(jì)24. tcp/ip協(xié)議的系統(tǒng)實(shí)現(xiàn)35. 結(jié)論116. 詳細(xì)設(shè)計(jì)代碼13wi ndows平臺(tái)下tcp/1p協(xié)議的設(shè)計(jì)與實(shí)現(xiàn)1. 引言本文背景基丁一個(gè)tcp/ip協(xié)議改進(jìn)項(xiàng)目,項(xiàng)目耍求通過(guò)改進(jìn)tcp/ip協(xié)議擁塞控制 算法 來(lái)提高無(wú)線網(wǎng)絡(luò)環(huán)境卜的數(shù)據(jù)喬吐量。目前的tcp協(xié)議在無(wú)線網(wǎng)絡(luò)環(huán)境下無(wú)法 區(qū)分岀擁塞丟包與誤碼丟包,根據(jù)這兩種不同的丟包原因需要對(duì)tcp的窗口進(jìn)行不 同的調(diào)整,因此需 要對(duì)現(xiàn)有的tcp/ip協(xié)議進(jìn)行改進(jìn)。針對(duì)這個(gè)需求提供的一個(gè)解 決方案就是口己開(kāi)發(fā)出一套tcp/ip協(xié)議以替代系統(tǒng)tcp/ip協(xié)議,但
2、是并不需要實(shí)現(xiàn) 整個(gè)tcp/ip議族,重點(diǎn)實(shí)現(xiàn)tcp與ip協(xié)議即可。2. tcp/ip協(xié)議驅(qū)tcp/ip協(xié)議是internet的技術(shù)基礎(chǔ)。internet是一個(gè)丿'-域網(wǎng),是目前聯(lián)通世界上 絕大多數(shù)國(guó)家和地區(qū)的全球性信息系統(tǒng)。在internet上,可以實(shí)現(xiàn)低成本、高速率、 交互式的信息 杳詢(xún)、信息發(fā)布、通訊聯(lián)絡(luò)以及協(xié)同作業(yè)等等現(xiàn)代化的工作、學(xué)習(xí) 和生活。tcp/ip協(xié)議族通常分為四個(gè)層次,應(yīng)用層、傳輸層、網(wǎng)絡(luò)層和鏈路層。如圖1所示:應(yīng)用層(ftp, smtp等)傳輸層(tcp, udp等)網(wǎng)絡(luò)層仃p, icmp等)鏈路層(網(wǎng)卡驅(qū)動(dòng)等)圖1 tcp/ip協(xié)議族四層結(jié)構(gòu)應(yīng)用層向用戶(hù)提供一組
3、常用的應(yīng)用程序,比如電了郵件(smtp)、文件傳輸訪問(wèn)(ftp)、遠(yuǎn)程登錄(telnet)等。傳輸層提供進(jìn)程間端到端的通信。在tcp/ip協(xié)議族屮,主要有兩種不同的傳輸 協(xié)議:傳輸控制協(xié)議(tcp)和用戶(hù)數(shù)據(jù)報(bào)協(xié)議(udp) o tcp提供面向連接的、可靠的(沒(méi) 冇數(shù)據(jù)重復(fù)或丟失),全雙工的數(shù)據(jù)流傳輸服務(wù)。而udp則捉供的是不可靠的而向 無(wú)連接的數(shù)據(jù)傳輸服務(wù),其可靠性應(yīng)由上層應(yīng)用程序來(lái)支持。網(wǎng)絡(luò)層,主要負(fù)責(zé)數(shù)據(jù)包的分組及路由選擇。在tcp/tp協(xié)議族中,網(wǎng)絡(luò)層協(xié)議包括 網(wǎng)際協(xié)議ip、互連網(wǎng)控制報(bào)文協(xié)議icmp、地址轉(zhuǎn)換協(xié)議arp和反向地址轉(zhuǎn)換協(xié)議rarr。鏈路層處于四層結(jié)構(gòu)的最低層,負(fù)責(zé)接收i
4、p數(shù)據(jù)報(bào)并通過(guò)網(wǎng)絡(luò)發(fā)送之,或從網(wǎng) 絡(luò)上接 收物理幀,抽出ip數(shù)據(jù)報(bào),交給ip層。通常包括網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序及網(wǎng)絡(luò) 接口卡等。3. tcp/ip協(xié)議的系統(tǒng)設(shè)計(jì)以windows網(wǎng)絡(luò)體系結(jié)構(gòu)為基礎(chǔ),參照windows ddk屮關(guān)于網(wǎng)絡(luò)協(xié)議驅(qū)動(dòng)與傳輸驅(qū)動(dòng) 接口(tdi)的相關(guān)資料,以及考慮到與原有系統(tǒng)tcp/ip兼容,提出的設(shè)計(jì)方案如圖2 所示。win 32 apitdi客八td1扌攵i indis扌如itd1役輸器下層微錮n駅動(dòng)(miniport driver)圖2 tcp/ip協(xié)議設(shè)計(jì)框圖應(yīng)用程序也就是根據(jù)協(xié)議開(kāi)發(fā)的特定應(yīng)用。這里是針對(duì)開(kāi)發(fā)的tcp/ip協(xié)議編寫(xiě) 的一個(gè)ftp小應(yīng)用程序,用來(lái)測(cè)試開(kāi)發(fā)
5、的協(xié)議。應(yīng)用程序通過(guò)win32 api接口將其操作轉(zhuǎn)化成相應(yīng)的請(qǐng)求提交給tdi客戶(hù)。傳輸驅(qū)動(dòng)程序接口(tdt)客戶(hù)是核心態(tài)的驅(qū)動(dòng)程序。它的主要功能是完成上層 應(yīng)用 程序的請(qǐng)求,或者根據(jù)該請(qǐng)求產(chǎn)生相應(yīng)的tdi操作,并將該操作傳遞給下層的 tdi傳輸器。tdi客戶(hù)通過(guò)win32 api接口與上層應(yīng)用程序交互;通過(guò)tdi接口與下層 td1傳輸器進(jìn)行交互。tdi傳輸提供者(tdi transport provider)又稱(chēng)為tdi傳輸器,dis協(xié)議驅(qū)動(dòng)程 序,以及協(xié)議驅(qū)動(dòng)程序,是工作在核心態(tài)的協(xié)議驅(qū)動(dòng)程序。其中tcp協(xié)議,叩協(xié)議, arp協(xié)議 等都是在這個(gè)模塊屮實(shí)現(xiàn)。它通過(guò)tdi接口與上層的tdi客戶(hù)
6、進(jìn)行交互;通 過(guò)ndis接口與下層微端口駆動(dòng)進(jìn)行交互。nd1s下層微端口驅(qū)動(dòng)程序是工作在核心態(tài)的驅(qū)動(dòng)程序,它負(fù)責(zé)將td1傳輸器接入 至特 定的網(wǎng)絡(luò)適配器。它通過(guò)ndis接口與上下層進(jìn)行交互。4. tcp/ip協(xié)議的系統(tǒng)實(shí)現(xiàn)由圖2中可以看岀,整個(gè)系統(tǒng)可分為四部分,應(yīng)用程序、tdi客戶(hù)、td1傳輸器和 卜層 微端口驅(qū)動(dòng)。事實(shí)上對(duì)于下層微端口驅(qū)動(dòng)并不需要考慮,因?yàn)榭梢灾苯诱{(diào)用 ndts庫(kù)函數(shù)將數(shù)據(jù)轉(zhuǎn)發(fā)到這層,處于這層上的驅(qū)動(dòng)會(huì)自動(dòng)將數(shù)據(jù)送出網(wǎng)絡(luò)適配器。 因此真正需要開(kāi)發(fā)的也 就是上面三個(gè)部分。應(yīng)用程序是用來(lái)實(shí)現(xiàn)簡(jiǎn)単文件傳輸?shù)模?因此考慮開(kāi)發(fā)兩個(gè)小應(yīng)用程序,一個(gè)為服務(wù)器端,一個(gè)為客戶(hù)端,服務(wù)器端用來(lái)
7、監(jiān)聽(tīng)和處理來(lái)自客戶(hù)端的連接請(qǐng)求??蛻?hù)端主要是向服務(wù)器端請(qǐng)求連接和發(fā)送數(shù) 據(jù)。tdi客戶(hù)負(fù)責(zé)將來(lái)口應(yīng)用程序的請(qǐng)求進(jìn)行相應(yīng)的處理z后轉(zhuǎn)發(fā)給卜層的tdi傳輸 驅(qū)動(dòng)。tdt傳輸驅(qū)動(dòng)主要是實(shí)現(xiàn)tcp, tp等功能,并與下層的ndis接口進(jìn)行交互。 4.1應(yīng)用程序的實(shí)現(xiàn)客戶(hù)端可以通過(guò)本地的某個(gè)端口向?qū)Ψ桨l(fā)送數(shù)據(jù)。并顯示一些錯(cuò)謀狀態(tài)。 服務(wù)器端,可以指定在本地的某個(gè)端口監(jiān)聽(tīng)連接請(qǐng)求,接收數(shù)據(jù),并顯示一些狀態(tài)。 實(shí)現(xiàn):通過(guò)devicelocontrol及相應(yīng)controlcode來(lái)將命令傳輸?shù)较聦拥膖di客 戶(hù)。主要接口 函數(shù):createfile 和devicelocontrolcreatefile函數(shù)原型
8、:handle createfile(lpctstr ipfilename,dword dwdesi red a ccess,dword dwsharemode,lpsecurity_attributes ipsecurityattributes,dword chvcreationdisposition,dword dwflagsandattrihutes,handle htemplatefile);ipfilename在這里就是指向要操作的tdi客戶(hù)(驅(qū)動(dòng))的符號(hào)鏈接,符號(hào)鏈接是 下層驅(qū)動(dòng)程序?qū)in32子系統(tǒng)可見(jiàn)的引用符號(hào),也就是代表了一個(gè)下層的張動(dòng)。這個(gè)函 數(shù)的功能是打開(kāi)下層的tdi客戶(hù)
9、,并返回該設(shè)備句柄,以后對(duì)設(shè)備的所有操作都是通過(guò)該 句柄來(lái)引用。devicelocontrol 函數(shù)原型:bool deviceiocontrol(handle hdevice.dword dwiocontrolcode,lpvoid ipinbuffer,d word nlnbuffersize,lpvoid ipoutbujfer,dword noutbuffersize,lpd word ip bytes re tu rn ed,lp over la pped ipoverlapped);hdevice和dwiocontrolcode是這里最重要的兩個(gè)參數(shù)。前者是前而createfile
10、返 回的句柄,代表設(shè)備對(duì)象,在這里即是下層的tdi客戶(hù),表明是對(duì)它進(jìn)行操作;后者是i/o 控制碼,表明要在該設(shè)備上進(jìn)行的操作類(lèi)型,如發(fā)送數(shù)據(jù),這個(gè)控制碼可以是口定義的。 在應(yīng)用程序調(diào)用了devicciocontrol z后就將操作請(qǐng)求提交給了處于系統(tǒng)內(nèi)核中 的tdi客戶(hù)。4.2 tdi客戶(hù)的實(shí)現(xiàn)tdi客戶(hù)將上層應(yīng)用程序發(fā)過(guò)來(lái)的i/o請(qǐng)求包(irp)進(jìn)行處理,能在木層處理的則 處理后直接返回,需要底層繼續(xù)完成的則先將當(dāng)前的irp狀態(tài)設(shè)置為掛起,然后重新設(shè) 置一個(gè)trp移交給下層驅(qū)動(dòng)繼續(xù)處理。實(shí)現(xiàn):主要是tirdctcpiocontroldispatch派遣例程的實(shí)現(xiàn)。這個(gè)派遣例程與devicel
11、ocontrol函數(shù)相對(duì)應(yīng)。其主要功能是根據(jù)應(yīng)用程序的不同請(qǐng)求(攜帶在irp 屮的iocontrolcode)進(jìn)行不同的處理。只是這里需耍額外考慮的是,需要在tdi客戶(hù)的 該例程屮事先判斷下是對(duì)服務(wù)器端的tdi客戶(hù)操作還是針對(duì)客戶(hù)端的tdi客戶(hù)進(jìn)行操 作。主要接口函數(shù):xxxjocontroldispatch,tdibuildxxx 和iocalldriveroxxxjocontroldispatch 函數(shù)原型:ntstatusxxx_devi celo controlin pdevice_objectpdeviceobject,in pirp plrp);驅(qū)動(dòng)程序屮注冊(cè)的派遣例程都是pdev
12、iceobject和plrp這兩個(gè)參數(shù),前面代表了要 操作的設(shè)備對(duì)彖,后者代表i/o請(qǐng)求類(lèi)型。pdeviceobject在這里具體的是只指服務(wù)器 端的tdi客戶(hù)或客戶(hù)端的tdi客戶(hù)?,F(xiàn)在以服務(wù)器的tdi客戶(hù)為例,假設(shè)要對(duì)其進(jìn)行一個(gè)監(jiān) 聽(tīng)操作,則此吋irp屮所攜帶b'jiocontrolcode則是一個(gè)代表監(jiān)聽(tīng)操作的控制碼。這個(gè)函數(shù) 就是根據(jù)不同的控制碼來(lái)決定要進(jìn)行的操作直接完成irp或者是轉(zhuǎn)發(fā)請(qǐng)求到下層。對(duì)于我們的協(xié)議來(lái)說(shuō),很多情況下tdi客戶(hù)是不能獨(dú)立完成一個(gè)irp請(qǐng)求的,需要 轉(zhuǎn)發(fā)到下層也就是它的tdi傳輸器來(lái)繼續(xù)完成irp的。這個(gè)吋候就會(huì)用到后面的兩個(gè) 重要函數(shù)tdibuildx
13、xx,和iocalldriver 了。tdibuildxxx函數(shù)原型:根據(jù)10控制碼的不同,該函數(shù)的聲明也稍有區(qū)別。仍舊接著前面的事例,tdi客 戶(hù)不能夠獨(dú)口完成應(yīng)用程序的監(jiān)聽(tīng)請(qǐng)求,因此需要借助tdibuildxxx函數(shù)來(lái)牛成相應(yīng) 的 irp,交給卜層的tdi傳輸器進(jìn)行處理。這里的xxx既代表不同的操作,對(duì)于監(jiān)聽(tīng)來(lái)說(shuō), 既是tdibuildlisteno其函數(shù)原型如下:voidtdibuildlisten(pirp irpfpdevice_object devobj,pfile_object fileobj,pvoid comproutine,pvoid contxt,ulong flags,
14、ptd1_connectionnf0rmat10n requestconnectionlnfo.ptdiconnectionjnformation returnconnectionlnfo);這個(gè)函數(shù)中最重要的三個(gè)參數(shù)是irp、devobj和fileobj,第一個(gè)是預(yù)先分配好的一 個(gè)irp結(jié)構(gòu)體指針;第二個(gè)是這個(gè)irp將要轉(zhuǎn)發(fā)到的設(shè)備對(duì)象,也就是tdt傳輸器; 第三個(gè)是tdi傳輸器的文件對(duì)象指針,可以是代表傳輸?shù)刂返奈募?duì)象,可以是代 表連接端點(diǎn)的文件對(duì)彖,可以是代表控制信道的文件對(duì)彖,不同的文件對(duì)象上可以進(jìn)行的操作也不一 樣,比如tdi.listen操作只可以在代表連接端點(diǎn)的文件對(duì)象上進(jìn)行。
15、該函數(shù)主要 是對(duì)新建的irp進(jìn)行設(shè)置,關(guān)鍵是給這個(gè)irp設(shè)置了操作碼為tdllisten.在創(chuàng)建了這個(gè)irp以后, tdi客戶(hù)將這個(gè)irp請(qǐng)求轉(zhuǎn)發(fā)到它的tdi傳輸器,這個(gè)過(guò)程是通過(guò)調(diào)用 iocalldriver函數(shù)來(lái)實(shí)現(xiàn)的。localldriver 函數(shù)原型:ntstatusiocalldriver(in pdevice_object deviceobjectfin out pirp irp);該函數(shù)將irp請(qǐng)求轉(zhuǎn)發(fā)給指定的設(shè)備對(duì)象。在我們的程序中,既是將tdi客戶(hù)中生 成的irp發(fā)給下層的tdi傳輸器,即我們的協(xié)議驅(qū)動(dòng)進(jìn)行處理。deviceobject為代表f 層 tdi傳輸器的設(shè)備對(duì)象,i
16、rp為要進(jìn)行的操作,如而面事例中生成的tdllisten請(qǐng)求。 在tdi客戶(hù)調(diào)用iocalldriver之后,irp請(qǐng)求就轉(zhuǎn)到了tdi傳輸器,即我們的tcp/ip協(xié)議中處理了。4.3 tdi傳輸器的實(shí)現(xiàn)tdi傳輸器也就是我們的協(xié)議驅(qū)動(dòng),也就是tcp/ip協(xié)議。簡(jiǎn)單的說(shuō),這層的主要 操作仍然是根據(jù)上層tdi客戶(hù)捉交過(guò)來(lái)的請(qǐng)求進(jìn)行不同的處理。只不過(guò)這里又冇特殊的 含義,就是耍完成tcp/ip的相應(yīng)功能,因此這一層是我們實(shí)現(xiàn)中最重耍的部分。在這層中,tdi傳輸器接收到上層tdi客戶(hù)轉(zhuǎn)交過(guò)來(lái)的請(qǐng)求,系統(tǒng)根據(jù)用戶(hù)注冊(cè) 的函數(shù)入口找到處理請(qǐng)求的函數(shù)irdctcpinternaldevicecontrold
17、ispatch。該函數(shù)則根據(jù)操 作的對(duì)彖和操作的類(lèi)黑進(jìn)行不同的函數(shù)調(diào)用。irdctcpinternaldevicecontroldispatch 的函數(shù)原型:ntstatusirdctcpinternaldevicecontroldispatch(in pdevice_object deviceobjectfin pirp irp)參數(shù)deviceobject代表了當(dāng)前的設(shè)備對(duì)象,也就是tdi傳輸器。irp為irp請(qǐng)求指 針,表明了要操作的文件對(duì)象和需要進(jìn)行的操作。該函數(shù)首先根據(jù)不同的文件對(duì)象 進(jìn)行分類(lèi),然后對(duì)某一個(gè)文件對(duì)象可以進(jìn)行的操作進(jìn)行列表。當(dāng)某一請(qǐng)求到來(lái)時(shí), 根據(jù)比較這些參數(shù)找到對(duì)應(yīng)的
18、操作。以下就按tcp/ip i辦議對(duì)數(shù)據(jù)的處理流程詳細(xì) 進(jìn)行分析。依數(shù)據(jù)傳輸?shù)姆较虼笾驴梢苑殖砂l(fā)送和接收過(guò)程。4. 3.1發(fā)送過(guò)程上層應(yīng)用程序發(fā)起一個(gè)發(fā)送請(qǐng)求。首先應(yīng)用程序調(diào)用createfile函數(shù)打開(kāi)tdi客 戶(hù),然后調(diào)用devicelocontrol將請(qǐng)求轉(zhuǎn)發(fā)到內(nèi)核的tdi客戶(hù),tdi客戶(hù)進(jìn)行相應(yīng) 的處理之后,調(diào)用tdibuildsend設(shè)置一個(gè)tdi.send請(qǐng)求,然后再調(diào)用 iocallerdriver將該請(qǐng)求轉(zhuǎn)發(fā)給tdi傳輸器,即tcp/ip協(xié)議進(jìn)行處理。為了描述主 線,這里暫把先前tcp建立連接的三次握手過(guò)程給省略了。發(fā)送過(guò)程如圖3所示。圖3發(fā)送框圖數(shù)據(jù)從tdi客戶(hù)進(jìn)入tdi傳輸
19、器后,經(jīng)過(guò)一系列的函數(shù)調(diào)用,生成適合在網(wǎng)絡(luò)上 傳輸?shù)臄?shù)據(jù)包。這個(gè)過(guò)程包括對(duì)數(shù)據(jù)的封包,超時(shí),創(chuàng)建重傳隊(duì)列,數(shù)據(jù)分片,路 由設(shè)置等。發(fā)送數(shù)據(jù)時(shí)首先雙方應(yīng)該建立連接前完成一個(gè)三次握手的過(guò)程,在連接 建立以后雙方開(kāi)始進(jìn)行可靠的通信。圖4所示為建立連接以后,發(fā)送過(guò)程在tcp/ip 協(xié)議層屮函數(shù)的調(diào)用流圖。tdi傳輸器的派逍例程調(diào)用tcp_send函數(shù)發(fā)送數(shù)據(jù),將 數(shù)據(jù)轉(zhuǎn)入到tcp層,完成tcp層的包頭以及控制狀態(tài)的設(shè)置。在調(diào)用ip_queue_xmit 后,數(shù)據(jù)轉(zhuǎn)到ip層進(jìn)行處理,在這里完成ip包格式的設(shè)置以及分片操作等。最后 調(diào)用ether.output函數(shù)設(shè)置好mac頭以后,一個(gè)完整的數(shù)據(jù)幀就行成
20、了,然而為 了符合ndis對(duì)數(shù)據(jù)包格式的封裝要求,這里需要對(duì)數(shù)拯結(jié)構(gòu)進(jìn)行調(diào)整。數(shù)據(jù)在進(jìn) 入ether_output函數(shù)前一直是以sk_buff的形式進(jìn)行管理的,這個(gè)結(jié)構(gòu)體冇四個(gè)指 針,通過(guò)對(duì)這四個(gè)指針的上下移動(dòng)來(lái)對(duì)數(shù)據(jù)進(jìn)行操作。在進(jìn)入ether.output函數(shù)z 后數(shù)據(jù)重新打包成適合ndis接口傳輸?shù)膒acket形式。然后調(diào)用ndis函數(shù) ndissend函數(shù)將數(shù)據(jù)由下層驅(qū)動(dòng)送出。td1客戶(hù)圖4發(fā)送過(guò)程tcp/ip協(xié)議層函數(shù)流程圖4. 3. 2接收過(guò)程下層網(wǎng)卡接收到數(shù)據(jù)以后,將通知微端口驅(qū)動(dòng)程序,微端口驅(qū)動(dòng)程序再將數(shù)據(jù)指示 給ndis協(xié)議張動(dòng)程序進(jìn)行處理。在協(xié)議層中對(duì)數(shù)據(jù)進(jìn)行一系列的處理之后
21、再通知 給td1客戶(hù),tdi客戶(hù)再將數(shù)據(jù)通知給上層應(yīng)用程序。接收過(guò)程如圖5所示。微靖i 1加動(dòng)和庁指小的數(shù)抑;圖5接收框圖數(shù)據(jù)從微端口指示給ndts協(xié)議驅(qū)動(dòng)以后,首先將ndis層的數(shù)據(jù)包格式packet拆 開(kāi)組裝成sk_buff的形式,設(shè)置好該結(jié)構(gòu)的各個(gè)成員。然后調(diào)整它的四個(gè)指針來(lái)獲 取不同層的實(shí)際數(shù)據(jù)。首先分離出mac幀頭,判斷收到的包是否為ip包,否則直 接丟棄,是則繼續(xù)往上進(jìn)入1p層處理。然后分離岀1p頭,判斷當(dāng)前包是否分片, 是則等收齊所有分片以后重新組包往上傳遞,不是則直接上傳。最后分離出tcp頭, 通過(guò)分析tcp頭中所攜帶的信息,以及當(dāng)前tcp所在的狀態(tài)來(lái)進(jìn)行相應(yīng)的處理。如 當(dāng)前的
22、tcp狀態(tài)是尚未建立連接則調(diào)用tcp_rcv_state_process函數(shù),該函數(shù)根據(jù) tcp頭中標(biāo)志位的置位情況來(lái)進(jìn)行相應(yīng)處理。如果己經(jīng)建立連接則調(diào)用 tcp_rcv_established函數(shù)進(jìn)行數(shù)據(jù)的接收過(guò)程處理,將接收的數(shù)據(jù)加入隊(duì)列,當(dāng) 隊(duì)列滿(mǎn)了以后通過(guò)設(shè)置事件的信號(hào)態(tài)來(lái)指示上層的tdi客戶(hù)有數(shù)據(jù)到達(dá),然后tdi 客戶(hù)以同樣的方式通知上層應(yīng)用程序。接收過(guò)程tcp/tp協(xié)議層中的函數(shù)調(diào)用過(guò)程 如下圖6所示。tdi紗圖6接收過(guò)程tcp/tp協(xié)議層函數(shù)流程圖5.結(jié)論本文以rfc文檔中關(guān)于tcp/ip協(xié)議的標(biāo)準(zhǔn)規(guī)范為理論基礎(chǔ),以windows ddk 為開(kāi)發(fā)工具,結(jié)合項(xiàng)目需求,設(shè)計(jì)開(kāi)發(fā)了一套
23、tcp/tp協(xié)議。本套協(xié)議并未實(shí)現(xiàn)整 個(gè)tcp/ip協(xié)議族中的所有協(xié)議,只是對(duì)tcp和ip部分進(jìn)行了實(shí)現(xiàn)。在前面總體協(xié) 議框架的設(shè)計(jì)基礎(chǔ)上,最終得到的產(chǎn)品有,ftp測(cè)試應(yīng)用程序,tdi客戶(hù)及tcp/ip 協(xié)議(tdi傳輸器)。下而是測(cè)試該tcp/ip i辦議的部分截圖。圖7為啟動(dòng)加載tcp/ip 協(xié)議(irdctcp)與ti)i客戶(hù)(tditirdctcp)的截圖。圖8為協(xié)議接收數(shù)據(jù)的截圖。file idit channels vie* options help創(chuàng)*©|x|剖ia|a|制ek囲w昌囤tue : message text6b666b6635353597535355355
24、3 7 7 7 7 7 7 7 t ay ay ay ay ay nbqv ay -y qw hmv -y ny ay «y qv qv qw qvirdctcp: drivereittryirdctcp: d:iveren:ry: cancelld 0irdctcp: refopen: open 840bf720, old ref 0, irdctcp: great ebinding: open 840朋720/0, devi( *«x»createbindin:tdire(isterdeviceobject»*> »*>)
25、87;creat ebindin(: tdire(isternetaddress*<* irdctcp: great ebinding: opencomext 840bf72o, irdctcp: pnpevent: open 00000000$ even: 6,st; tdi?irdctcp:tdittcp: driverentn tdi:irdctcp:regis:rypath: registryhachines tdi?irdctcp:tclientjeviceload: entry. tdi?irdctcp:*>*«?client deviceload end*&
26、quot;* tdiirdctcpjtserver.deviceload: entry. tdi?irdctcp:*«?server deviceload end*t* 一 end 一圖7啟動(dòng)tcp ip協(xié)議與tdi客八截圖mwag. tirt irdetcpreceive: entryirdctcp: irdctcpreceivo: receive in ip s4i951e4ooob6&325d90oo0130184l95lf40028bd0840006d06841841952048628if90m1530cb86b84195214fc77b39boo00oo00000i
27、rdctcp: skb.he£roapool: entry. irdctcp: skb.head.froikj>ool: endth* irdctcp: ether recv:entry83fa592000ob6132sd90000130183fa593o0028bd0840006d0684183fa59408628if90041530cb86birdctcp: ip.rcv:entryirdctcp: lp.local.deliver: entry1rdctcp: lp.local.deliver.fmish:entry irdctcp: ip.r«&疝 i
28、rdctcp: lp.lookup.route: look saddr: irdctcp: 1p.add.rout:ent ry. irdctcp: lplookup.route: look saddr:- irdctcp: ip_add.route:end.irdctcp: lplookuproute: look saddr:6圖8接收數(shù)據(jù)截圖圖7啟動(dòng)tcp/ip i辦議與tdi客尸截圖圖8接收數(shù)據(jù)截圖6.詳細(xì)設(shè)計(jì)代碼(1)映射網(wǎng)絡(luò)驅(qū)動(dòng)器功能實(shí)現(xiàn);實(shí)現(xiàn)代碼如下:u pdatedata(false);dword nretval;netresource nr;nr.dwtype = resour
29、cetype_any;lptstr local =(lptstr)(lpctstr)m_strlocal;nr.lplocalname=t2w(local);lptstr tar =(lptstr)(lpctstr)m_strtar;nr.lprcmotcnamc = t2w(tar);nr.lpprovider = null;nretval = wnetaddconnection2(&nr, m_strpwd, m_struser, false);if(nretval = no.error) cstring strtext;strtext.format(cstringc,映射文件 &
30、#39;%sv 到網(wǎng)絡(luò)驅(qū)動(dòng)盤(pán) '%s'成功 ”), m_strtar,m strlocal);afxmessagebox(strtext);return;messagebox(cstring("映射網(wǎng)絡(luò)驅(qū)動(dòng)盤(pán)失敗!");void cmapdlg:onbnclickedbuttondismap()dword nretval;u pdatedata(true);nretval = wnetcancelconnection2(m_strlocal, connect_update_profile, false);if(nretval = no_error)cstri
31、ng strtext;strtext.format(cstring("斷開(kāi)網(wǎng)絡(luò)驅(qū)動(dòng)器映射'%s* 成功!h),m_strlocal);messagebox(strtext);return; messagebox(cstring("斷開(kāi)網(wǎng)絡(luò)驅(qū)動(dòng)器映射失敗!");(2) 單個(gè)ip共享資源搜索實(shí)現(xiàn)。(3) 搜索所冇計(jì)算機(jī)的共享資源實(shí)現(xiàn)。實(shí)現(xiàn)代碼如下:void ctmpl dlg:onbnclickedok() m_listctrlres.deleteallitems();if(m_operate=0)byte bip4;m_iptar.getaddress(bi
32、po,bip 1 ,bip2,bip );cstring tar add;taradd.format(cstring(” d.%d.%d.%d”),bip0,bipl,bip2,bip3);search(taradd);else if(m_operate= 1)searchall();tchar* ctmpldlg:cstring2tchar(cstring& str) int ilen = str.getlength();tchar* szrs = new tcharlilenj;lstrcpy(szrs, str.getbuffer(ilen);str.releasebuffer(
33、);return szrs;void ctmpl dlg:onbnclickedradioall() getdlgitem(idcpaddress_tar)->enablewindow(0);m_operate= 1;void ctmpldig:onbnclickedradioper() getdlgitem(idcpaddress_tar)->enablewindow(l);m_operate=0;int ctmp 1 dlg:search(cstring tarip) tchar *tmp=cstring2tchar(tarip);pshare_info_1 bufptr,p;
34、net_api_status res;lptstr ipszserver = null;dword er=0,tr=0,resume=0, i;ipszserver = tmp;do / begin do res = netshareenum (ipszserver, 1, (lpbyte *) &bufptr, -1, &er, &tr, &resume); if(res = error.success ii res = error_more_data)p=bufptr;for(i=0;i<er;i+)cstring strnetname =p->
35、shi l_netname;cstring strremark =p->shil_remark;dword dwtype=p->sh訂type;cstring strtype;if(dwtype=stype_disktree)strtype=cstring(" w 盤(pán)驅(qū)動(dòng) ”);else if(dwtype=stype_printq)strtype二cstring(”打印機(jī)序列”);)else if(dwtype=stype_dev!ce)strtype=cstring(n 通信設(shè)備“);else if(dwtype=stype_ipc)strtype=cstring(h
36、 進(jìn)程間通信(ipc)”);else if(dwtype=stype_special)strtype=cstring(nw 殊共享”);else if(dwtype=stype_temporary)strtype=cstri ng("臨時(shí)共享”)else strtype.format(cstring("%d"),dwtype); int ncount=m_listctrlres.getitemcount();m_listctrlres.lnsertitem(ncount,tarip,0);m_listctrlres.setitemtext(ncount, 1 ,s
37、trnetname);m_listctrlres.setitemtext(ncount,2,strremark);m_listctrlres.setitemtext(ncount,3,strtype);p+;net api b ufferfree( b ufptr);elseif(res!=error_success&&res! =error_more_d ata&&m_operate=0) messagebox(cstringc's有共享信息!“); while (res=error_more_data); / end doreturn 0;void
38、ctmp 1 dig:searchall(void) lpserver_info_101 pbuf = null;lpserverjnfo_101 ptmpbuf;dword dwlevel = 101;dword dwprefmaxlen = max_preferred_length;dword dwentriesread = 0;dword dwtotalentries = 0;dword dwservertype = sv_type_server;/ all serversdword dwresumehandle = 0;net_api_status nstatus;lptstr psz
39、servername = null;lptstr pszdomainname = null;dword i;wsadata wsadata;wsastartup(makeword(2,0), &wsadata);nstatus = netserverenum(pszservername,dwlevel,(lpbyte *) & pbuf,dwprefmaxlen,& dwentriesread,& dwtotalentries,dwservertype,pszdomainname,& dwresumehandle);訐(nstatus = nerr_su
40、ccess) ii (nstatus = error_more_data) if (ptmpbuf = pbuf) != null) for (i = 0; i < dwentriesread; i+) cstring hostname=ptmpbuf->svl()l_name; char szhostnamel 128= ao*;int hostlength=hostname.getlength(); for(int j=0;j<hostlength;j+)szhostnamej=hostnamej;hostent * ent = gethostbyname(szhostn
41、ame);if(ent=null)ptmpbuf+;continue;cstring strhostip;in_addr* inhostip=(in_addr *)ent->h_addr_listo;strhostip.format(cstring(h%d.%d.%d.%dn),inhostip->s_un.s_un_b.s_blinhostip->s_un.s_un_b.s_b2,inhostip->s_un.s_un_b.s_b3,inhostip->s_un.s_un_b.s_b4);search(strhostip);ptmpbuf+;if (pbuf !
42、= null)netapibufferfree(pbuf);wsacleanupo;(4) 將搜索結(jié)果保存為文本實(shí)現(xiàn):將text文檔保存在recordo text文檔中,上圖保存后的文檔如下e$注樣!pc$汪d$主林f$注科adm1k$鶯鱷ipc$ * ipc$1pc$ t print$ 打印機(jī)b類(lèi)型,打印網(wǎng)絡(luò)名印機(jī)發(fā)送至w弟0" 2807聶磊,ipcf 2注釋?zhuān)h(yuǎn)獻(xiàn)猊"°類(lèi)型乎等亦幕6曬1111 *1111*
43、11 *6*11331313131317record.txt 記辱本心11i7$5o21m21m殊衣疔疾默編張t絡(luò)絡(luò)絡(luò)絡(luò)絡(luò) 網(wǎng)網(wǎng)網(wǎng)網(wǎng)網(wǎng)名名名名名名名名名名冬名名-u u 二九s:二九 ppppppppppppp 機(jī) pp持尊養(yǎng)辛忑 us匕、£、£、t、e、 云 f 4/ 克多 e oht rzfr- s c c c q
44、 opc管iplpip腸cr 聶共共共遠(yuǎn)共共 達(dá)靈認(rèn)認(rèn),認(rèn)認(rèn) 戰(zhàn),默默袞默注:實(shí)現(xiàn)代碼如下:void ctmpi dlg:onbnclickedbutton2()/ todo:在此添加控件通知處理程序代碼int ncount=m_listctrlres.getitemcount();cstring strlpadd;cstring strnetname;cstring strremark;cstring strtype;cfile file;file.open(cstring("record.txt"),cfile:modecreatelcfile:modewrite);for(int i=0;i&l
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年民間借貸合同模板月息
- 六年級(jí)下冊(cè)數(shù)學(xué)教案-5.2 數(shù)與代數(shù) ︳西師大版
- 二年級(jí)下冊(cè)數(shù)學(xué)教案-4.4勤勞工作-筆算三位數(shù)加減三位數(shù)(一次進(jìn)位、退位) 青島版
- 2025年城鄉(xiāng)結(jié)對(duì)共建協(xié)議書(shū)范
- 2025年河北旅游職業(yè)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫(kù)及答案一套
- 化學(xué)-云南省三校2025屆高三2月高考備考聯(lián)考卷(六)試題和答案
- 2025江西省建筑安全員A證考試題庫(kù)及答案
- 2025年鶴崗師范高等專(zhuān)科學(xué)校單招職業(yè)傾向性測(cè)試題庫(kù)完整版
- 2025年度個(gè)人股份轉(zhuǎn)讓與員工分紅權(quán)合同模板
- 2025年度企業(yè)數(shù)字化轉(zhuǎn)型技術(shù)顧問(wèn)合作協(xié)議
- 小學(xué)科學(xué)新課標(biāo)科學(xué)課程標(biāo)準(zhǔn)解讀
- DeepSeek科普課件深度解析
- 湖南省長(zhǎng)沙市北雅中學(xué)2024-2025學(xué)年九年級(jí)下學(xué)期開(kāi)學(xué)考試英語(yǔ)試題(含答案含聽(tīng)力原文無(wú)音頻)
- 2025年駐村個(gè)人工作計(jì)劃
- 化工企業(yè)安全生產(chǎn)信息化系統(tǒng)管理解決方案
- 供電工程施工方案(技術(shù)標(biāo))
- 2023屆江西省九江市高三第一次高考模擬統(tǒng)一考試(一模)文綜試題 附答案
- 2024年共青團(tuán)入團(tuán)積極分子、發(fā)展對(duì)象考試題庫(kù)及答案
- 2024廣西公務(wù)員考試及答案(筆試、申論A、B類(lèi)、行測(cè))4套 真題
- 2024年山東省濟(jì)南市中考英語(yǔ)試題卷(含答案解析)
- 2022年版初中物理課程標(biāo)準(zhǔn)解讀-課件
評(píng)論
0/150
提交評(píng)論