一種支持IPv4/IPv6雙協(xié)議棧的軟件模塊_第1頁(yè)
一種支持IPv4/IPv6雙協(xié)議棧的軟件模塊_第2頁(yè)
一種支持IPv4/IPv6雙協(xié)議棧的軟件模塊_第3頁(yè)
一種支持IPv4/IPv6雙協(xié)議棧的軟件模塊_第4頁(yè)
一種支持IPv4/IPv6雙協(xié)議棧的軟件模塊_第5頁(yè)
已閱讀5頁(yè),還剩6頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

一種支持IPv4/IPv6雙協(xié)議棧的軟件模塊現(xiàn)有的互聯(lián)網(wǎng)采用IPv4協(xié)議[1]作為核心協(xié)議,IPv4定義的有限地址空間將影響互聯(lián)網(wǎng)的進(jìn)一步發(fā)展。為解決地址空間限制、安全、服務(wù)質(zhì)量等問(wèn)題,IETF在20世紀(jì)90年代中期制定IPv6[2]協(xié)議標(biāo)準(zhǔn)作為下一代互聯(lián)網(wǎng)核心協(xié)議。除對(duì)地址空間進(jìn)行擴(kuò)展以外,其還對(duì)IPv6地址的結(jié)構(gòu)重新作了定義,采用與IPv4中使用的CIDR類似的方法分配地址,提供自動(dòng)配置以及對(duì)移動(dòng)性、安全性等更好地支持。目前,國(guó)內(nèi)外各大廠商均在IPv6的應(yīng)用與研究方面投入大量的資源,并開發(fā)出相應(yīng)的軟硬件。2001年思科公司就正式在其路由器、交換機(jī)上支持IPv6協(xié)議;當(dāng)今大多數(shù)UNIX/Linux系統(tǒng)均支持IPv6,可以實(shí)現(xiàn)IPv4/IPv6雙棧運(yùn)行;Microsoft從Win2K開始推出IPv6TechPreview,并在WindowsXP上內(nèi)置了商用IPv6協(xié)議,尤其是其最近推出的WindowsVista操作系統(tǒng),提供了對(duì)新的IPv6協(xié)議的支持?;贗Pv6協(xié)議進(jìn)行軟件開發(fā)的需求日益明顯。由于多方面的原因,IPv6不可能在短時(shí)間內(nèi)取代IPv4,兩者將長(zhǎng)期共存。在開發(fā)新的軟件系統(tǒng)時(shí),越來(lái)越需要考慮是否提供對(duì)使用IPv6協(xié)議通信的潛在需求的支持?,F(xiàn)有的大量基于IPv4的軟件也將日益需要進(jìn)行移植和升級(jí),以支持IPv6。目前主流操作系統(tǒng)提供的socket函數(shù)API眾多,以Windows為例,其提供的基本socket函數(shù)就多達(dá)110個(gè),而僅僅是基本socket函數(shù)接口,就包括基本TCPsocket類、基本UDPsocket類、I/O復(fù)用socket類、設(shè)置socket選項(xiàng)類、基本名字與地址轉(zhuǎn)換socket類等。如果再加上高級(jí)socket函數(shù),還包括高級(jí)名字與地址轉(zhuǎn)換函數(shù)、高級(jí)I/O函數(shù)、非阻塞I/O函數(shù)、路由socket、原始socket等。而事實(shí)上,一般的網(wǎng)絡(luò)系統(tǒng),其通信功能往往只需使用其中的一些常用的socket函數(shù)即可完成,若能將這些常用的socket函數(shù),根據(jù)一般的功能需求進(jìn)行進(jìn)一步的整合,則可以減少重復(fù)開發(fā)的代價(jià)。如果能將這些一般的功能需求同時(shí)在IPv4和IPv6上予以實(shí)現(xiàn),一方面能簡(jiǎn)化上層開發(fā)者基于IPv6的網(wǎng)絡(luò)編程;另一方面也便于由IPv4軟件系統(tǒng)向支持IPv6通信的升級(jí)。支持IPv4/IPv6雙棧的通信模塊分析主要的操作系統(tǒng)平臺(tái)提供socket進(jìn)行client/server模式的網(wǎng)絡(luò)編程。該模式的主要流程如圖1所示。IPv6與IPv4的socket函數(shù)[3]相比主要不同之處包括sockaddr結(jié)構(gòu)的變化,本地全球可定址IPv6地址的獲取,listen()、connect()、accept()等函數(shù)的使用。如果直接采用基本socket函數(shù)來(lái)進(jìn)行IPv4和IPv6下的網(wǎng)絡(luò)編程,則需要由開發(fā)人員小心地處理這些差異,這一方面將不利于眾多IPv4協(xié)議下的網(wǎng)絡(luò)軟件系統(tǒng)向支持IPv6的升級(jí);另一方面更談不上實(shí)現(xiàn)兩者編程上的兼容[4,5]。當(dāng)前所存在的支持IPv4/IPv6雙棧通信功能的設(shè)計(jì)方法大致可分為兩種:a)混合方式。設(shè)計(jì)者將IPv4和IPv6兩種通信功能在一個(gè)模塊內(nèi)實(shí)現(xiàn),即在模塊內(nèi)部處理IPv4與IPv6通信的差異。該方式可用于全新的支持IPv4/IPv6雙棧通信的網(wǎng)絡(luò)軟件/系統(tǒng)的設(shè)計(jì)與開發(fā),但不利于現(xiàn)有的基于IPv4的網(wǎng)絡(luò)軟件系統(tǒng)向IPv6環(huán)境下的移植與升級(jí)。b)分離方式。設(shè)計(jì)者分別應(yīng)用兩個(gè)單獨(dú)的通信功能模塊實(shí)現(xiàn)所需的IPv4和IPv6通信功能,需要上層用戶自己負(fù)責(zé)區(qū)分IPv4和IPv6功能接口的差異。該方式有利于現(xiàn)有的基于IPv4的網(wǎng)絡(luò)軟件系統(tǒng)向IPv6環(huán)境的移植與升級(jí),但對(duì)于新的網(wǎng)絡(luò)應(yīng)用開發(fā)者而言,仍需考慮和熟悉底層的IPv4和IPv6的通信細(xì)節(jié)以及功能接口的差異,從而導(dǎo)致開發(fā)效率降低。支持IPv4/IPv6雙棧的通信模塊設(shè)計(jì)直接采用基本socket函數(shù)來(lái)進(jìn)行IPv4和IPv6下的網(wǎng)絡(luò)編程將需要處理不少的細(xì)節(jié)問(wèn)題,同時(shí)也不利于實(shí)現(xiàn)眾多IPv4協(xié)議下的網(wǎng)絡(luò)軟件系統(tǒng)向支持IPv6的升級(jí)。為了解決這個(gè)問(wèn)題,本文提出了一種解決方法,該方法整合了混合方式和分離方式各自的優(yōu)點(diǎn),采用面向?qū)ο蟮乃枷?,將按照統(tǒng)一接口的要求分別設(shè)計(jì)和實(shí)現(xiàn)的IPv4和IPv6通信功能模塊封裝成為一致通用的接口,設(shè)計(jì)了一組核心且簡(jiǎn)單易用的API接口。該方法的核心內(nèi)容可概述如下:首先,設(shè)計(jì)和實(shí)現(xiàn)一組核心的網(wǎng)絡(luò)通信功能部分的接口;然后根據(jù)該組接口的要求,利用基本socket函數(shù)分別設(shè)計(jì)和實(shí)現(xiàn)基于IPv4的核心網(wǎng)絡(luò)通信功能部分及基于IPv6的核心網(wǎng)絡(luò)通信功能部分;最終屏蔽了IPv4與IPv6下網(wǎng)絡(luò)編程的差異。下面是在 Windows平臺(tái)下,此方法的具體實(shí)現(xiàn)過(guò)程。2.1客戶端模塊的設(shè)計(jì)該部分用來(lái)完成網(wǎng)絡(luò)通信中的客戶端功能,應(yīng)用類繼承的思想,首先設(shè)計(jì)并實(shí)現(xiàn)通用的抽象接口父類;然后根據(jù)IPv4和IPv6底層socket函數(shù)使用方法的不同,分別繼承此抽象接口父類并實(shí)現(xiàn)進(jìn)行IPv4和IPv6通信功能的具體接口類。根據(jù)UML中類圖的通常畫法,此模塊的框架可描述如圖2所示。2.1.1客戶端抽象接口父類的設(shè)計(jì)與圖1相對(duì)應(yīng),圖2中給出了應(yīng)用C++苗述的接口類原型,在父類CClient中提煉并規(guī)定了涵蓋IPv4和IPv6網(wǎng)絡(luò)通信程序設(shè)計(jì)中客戶端程序所需要的基本接口方法。這些方法包括:檢查Winsock是否已經(jīng)初始化的IsInit();對(duì)Winsock進(jìn)行初始化的Init();連接遠(yuǎn)程服務(wù)器的ConnectServ();斷開與該遠(yuǎn)程服務(wù)器某端口連接的DisConnectServ();設(shè)置建立連接超時(shí)時(shí)間的SetTimeout();發(fā)送數(shù)據(jù)的SendData()和接收數(shù)據(jù)的RcvData()等。父類CClient的基本方法如下:classCClient{private:

初始化檢查public:初始化檢查virtualboolIslnint();//virtualvoidInit();//初始化virtualchar*ConnectServ(char*IP,int_port);virtualboolDisConnectServ(intport);//斷開virtualvoidSendData(char*data,intlen);// 發(fā)送virtualchar*RcvData();//接收virtualvoidSetTimeout(intsec,intusec);virtualvoidReleaseBuf(char*buff);// 釋放緩沖}其中:多數(shù)方法被設(shè)計(jì)和實(shí)現(xiàn)為virtual類型,以支持和實(shí)現(xiàn)在具體應(yīng)用中的動(dòng)態(tài)綁定。同時(shí),上層應(yīng)用程序開發(fā)者還可以根據(jù)本設(shè)計(jì)方法,針對(duì)自己的應(yīng)用程序所約定的通信協(xié)議,在本套基本接口的基礎(chǔ)上輕松地進(jìn)行擴(kuò)展。2.1.2IPv4客戶端接口類的設(shè)計(jì)具體完成IPv4通信功能的接口類CClientv4繼承自父類CClient(圖2),其所提供的接口方法與父類CClient所規(guī)定的接口方法相同,但其具體底層實(shí)現(xiàn)則依照IPv4下的socket函數(shù)使用方法完成。其中:此類的public方法ConnectServ()提供連接遠(yuǎn)程IPv4服務(wù)器的功能,其內(nèi)部實(shí)現(xiàn)流程的重要細(xì)節(jié)包括:首先使用lnit()初始化Winsock,然后使用socket。函數(shù)創(chuàng)建socket,接下來(lái)可以使用ioctlsocket()設(shè)置非阻塞的連接方式,再使用bind()將該socket綁定到本地地址,使用connect()向遠(yuǎn)程lPv4服務(wù)器發(fā)起連接請(qǐng)求,設(shè)置超時(shí)時(shí)間,并調(diào)用select()檢查是否可讀,成功后調(diào)用ioctlsocket()將該socket設(shè)置為阻塞模式。2.1.3lPv6客戶端接口類的設(shè)計(jì)與CClientv4類相類似,由類CClientv6來(lái)提供具體的實(shí)現(xiàn)lPv6通信的功能,該類也繼承自CClient(圖2),其所提供的public方法中包含了其父類CClient所規(guī)定的所有公共方法。與CClientv4類不同的是,其具體底層實(shí)現(xiàn)則參照l(shuí)Pv6下的socket函數(shù)使用方法來(lái)完成。此類的方法ConnectServ()提供連接遠(yuǎn)程lPv6服務(wù)器的功能,其內(nèi)部實(shí)現(xiàn)流程與CClientv4類的方法ConnectServ()有較大差異:它首先使用Init()初始化Winsock,然后填寫hint模板,準(zhǔn)備創(chuàng)建用于連接服務(wù)器的socket,再調(diào)用getaddrinfo()解析服務(wù)器地址,最后使用socket()函數(shù)創(chuàng)建socket;接下來(lái)可以選用ioctlsocket()設(shè)置非阻塞的連接方式,再使用connect()向遠(yuǎn)程IPv6服務(wù)器發(fā)起連接請(qǐng)求,設(shè)置超時(shí),并調(diào)用select()檢查是否可讀,調(diào)用freeaddrinfo()釋放解析地址時(shí)返回的地址列表,成功后可以選用ioctlsocket()將該socket設(shè)置為阻塞模式。

2.2服務(wù)器端模塊的設(shè)計(jì)對(duì)于用來(lái)完成網(wǎng)絡(luò)通信中的服務(wù)器端的功能部分,同樣可以采用類繼承的思想。先設(shè)計(jì)并實(shí)現(xiàn)通用的抽象接口父類,然后根據(jù)基本socket函數(shù)在IPv4和IPv6下的使用差別,分別繼承此接口類,依照統(tǒng)一的接口格式實(shí)現(xiàn)支持IPv4和IPv6通信功能的具體接口類。根據(jù)UML中類圖的畫法,此模塊的框架可以描述如圖3所示。2.2.1服務(wù)器端抽象接口父類的設(shè)計(jì)在類CSrvThread中,提煉出了包含IPv4和IPv6網(wǎng)絡(luò)通信程序設(shè)計(jì)中服務(wù)器端程序所需要的基本接口方法。這些方法主要有:用于啟動(dòng)線程的Start();用于終止線程的Stop();用于獲取接收到的數(shù)據(jù)包鏈表中的第一個(gè)包的GetFirstRcvData();用于刪除接收到的數(shù)據(jù)包鏈表中的第一個(gè)包的DelFirstRcvData();用于設(shè)置超時(shí)時(shí)間的SetTimeout();用于設(shè)置偵聽的最大連接數(shù)的SetMaxConn()等。多數(shù)方法被設(shè)計(jì)為virtual類型,以支持和實(shí)現(xiàn)在具體應(yīng)用中的動(dòng)態(tài)綁定。classCSrvThread:publicCThread{private:啟動(dòng)線程public:virtualvoidStart();//啟動(dòng)線程virtualvoidStop();//暫停線程virtualvoidRelease();//釋放資源virtualchar*GetFirstRcvData();virtualvoidDelFirstData();virtualvoidSetTimeout(longsec,longu_sec);virtualvoidSetMaxConn(intmaxconn);};值得注意的是,既可直接利用開發(fā)工具提供的線程類來(lái)作為類CThread使用,也可自行設(shè)計(jì)實(shí)現(xiàn)。2.2.2IPv4服務(wù)器端接口類的設(shè)計(jì)具體完成IPv4服務(wù)器端通信功能的接口類CSrvLstv4Thread繼承自父類CSrvThread,其所提供的接口方法包含了父類CSrvThread所規(guī)定的主要方法,具體底層實(shí)現(xiàn)則依照IPv4下socket函數(shù)的使用來(lái)進(jìn)行。該類的方法StartUp()實(shí)現(xiàn)為:初始化Winsock、綁定本地地址并進(jìn)行偵聽。其流程為:首先,調(diào)用WSAStartup()函數(shù)初始化Winsock,創(chuàng)建socket準(zhǔn)備進(jìn)行偵聽,調(diào)用gethostname()和gethostbyname()函數(shù)獲得主機(jī)地址信息,再調(diào)用bind()將該socket綁定到本地,最后調(diào)用listen()開始偵聽。需要注意的是,開發(fā)者還要根據(jù)所開發(fā)軟件的實(shí)際需求,設(shè)計(jì)與之相配套的接收線程接口類,該類需要處理少量與協(xié)議相關(guān)的細(xì)節(jié)。2.2.3IPv6服務(wù)器端接口類的設(shè)計(jì)類似地,完成IPv6服務(wù)器端通信功能的類CSrvLstv6Thread也繼承自類CSrvThread,其所提供的接口方法包含了父類CSrvThread所規(guī)定的主要接口方法,其底層實(shí)現(xiàn)則依照IPv6下的socket函數(shù)的使用法則進(jìn)行。對(duì)該類的重要方法startUp(),根據(jù)IPv6下特有的socket函數(shù),可以實(shí)現(xiàn)為:初始化Winsock,綁定本地地址并開始偵聽。其具體流程為:先調(diào)用WSAStartup()函數(shù)初始化Winsock,然后調(diào)用getaddrinfo()解析服務(wù)器地址,接著創(chuàng)建socket準(zhǔn)備進(jìn)行偵聽,再調(diào)用bind()將該socket綁定到本地,最后調(diào)用listen()開始偵聽并調(diào)用freeaddrinfo()釋放解析服務(wù)器地址時(shí)獲得的地址列表。同樣值得注意的是,還需要根據(jù)所開發(fā)軟件的實(shí)際需求,設(shè)計(jì)與之相配套的接收線程類,該類也需要處理少量與協(xié)議相關(guān)的細(xì)節(jié)。方法分析與應(yīng)用舉例使用此種設(shè)計(jì)方法,能夠使本文的面向雙棧的編程變得非常輕松,無(wú)須過(guò)多地考慮和處理涉及IPv6協(xié)議的細(xì)節(jié),就能使用與IPv4協(xié)議下的類似方法來(lái)編制程序,有效提高了開發(fā)效率。IPv4下的網(wǎng)絡(luò)編程和IPv6下的網(wǎng)絡(luò)編程幾乎可以做到一致。應(yīng)用實(shí)例如下:voidmain(){CClient*com1=newCClientv4();//創(chuàng)建IPv4客戶端網(wǎng)絡(luò)組件CClient*com2=newCClientv6();//創(chuàng)建IPv6客戶端網(wǎng)絡(luò)組件com1->lnit();//初始化com2->lnit();com1->ConnectServ("202.197.4.33",800)//連接遠(yuǎn)程IPv4服務(wù)器com2->ConnectServ("2001.250:f007:c:213:72ff:feb6:179",600);com1->SendData("Hello!",6);//與服務(wù)器進(jìn)行數(shù)據(jù)交互com2->SendData("World!",6);com1->DisConnPro();//斷開連接com2->DisConnPro();}同樣,本設(shè)計(jì)方法中給出的接口類CSrvThread、CSrvLstv4Thread、CSrvLstv6Thread的使用方法也類似于上例,在此就不再舉例說(shuō)明。采用這兩個(gè)模塊進(jìn)行網(wǎng)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論