999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

一種支持IPv4/IPv6雙協(xié)議棧的軟件模塊

2008-01-01 00:00:00達(dá)張廣興張大方謝高崗

摘要:分析已有的IPv4與IPv6的socket接口和實(shí)現(xiàn),設(shè)計(jì)了一種支持IPv4/IPv6雙協(xié)議棧的通信模塊。該模塊利用類繼承,為基于IPv4、IPv6雙協(xié)議棧的軟件開發(fā)提供了統(tǒng)一的底層通信功能編程接口。采用該模塊,還可以方便地升級(jí)原有只支持IPv4通信的軟件系統(tǒng),使其支持IPv6協(xié)議。該模塊已應(yīng)用于NGI網(wǎng)絡(luò)監(jiān)測(cè)分析系統(tǒng)NetTurbo。 關(guān)鍵詞:套接字;IPv4/IPv6雙協(xié)議棧;應(yīng)用程序編程接口

中圖分類號(hào):TP393.09文獻(xiàn)標(biāo)志碼:A

文章編號(hào):1001-3695(2008)01-0145-03

現(xiàn)有的互聯(lián)網(wǎng)采用IPv4協(xié)議[1]作為核心協(xié)議,IPv4定義的有限地址空間將影響互聯(lián)網(wǎng)的進(jìn)一步發(fā)展。為解決地址空間限制、安全、服務(wù)質(zhì)量等問題,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)性、安全性等更好地支持。

目前,國內(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開始推出IPv6 Tech Preview,并在Windows XP上內(nèi)置了商用IPv6協(xié)議,尤其是其最近推出的Windows Vista操作系統(tǒng),提供了對(duì)新的IPv6協(xié)議的支持。基于IPv6協(xié)議進(jìn)行軟件開發(fā)的需求日益明顯。

由于多方面的原因,IPv6不可能在短時(shí)間內(nèi)取代IPv4,兩者將長期共存。在開發(fā)新的軟件系統(tǒng)時(shí),越來越需要考慮是否提供對(duì)使用IPv6協(xié)議通信的潛在需求的支持。現(xiàn)有的大量基于IPv4的軟件也將日益需要進(jìn)行移植和升級(jí),以支持IPv6。目前主流操作系統(tǒng)提供的socket函數(shù)API眾多,以Windows為例,其提供的基本socket函數(shù)就多達(dá)110個(gè),而僅僅是基本socket函數(shù)接口,就包括基本TCP socket類、基本UDP socket類、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ù)、路由soc ket、原始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),一方面能簡化上層開發(fā)者基于IPv6的網(wǎng)絡(luò)編程;另一方面也便于由IPv4軟件系統(tǒng)向支持IPv6通信的升級(jí)。

1支持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ù)來進(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ā)效率降低。

2支持IPv4/IPv6雙棧的通信模塊設(shè)計(jì)

直接采用基本socket函數(shù)來進(jìn)行IPv4和IPv6下的網(wǎng)絡(luò)編程將需要處理不少的細(xì)節(jié)問題,同時(shí)也不利于實(shí)現(xiàn)眾多IPv4協(xié)議下的網(wǎng)絡(luò)軟件系統(tǒng)向支持IPv6的升級(jí)。為了解決這個(gè)問題,本文提出了一種解決方法,該方法整合了混合方式和分離方式各自的優(yōu)點(diǎn),采用面向?qū)ο蟮乃枷耄瑢凑战y(tǒng)一接口的要求分別設(shè)計(jì)和實(shí)現(xiàn)的IPv4和IPv6通信功能模塊封裝成為一致通用的接口,設(shè)計(jì)了一組核心且簡單易用的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)過程。

2.1客戶端模塊的設(shè)計(jì)

該部分用來完成網(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的基本方法如下:

class CClient

{

private:

…

public:

virtual bool Islnint();//初始化檢查

virtual void Init();//初始化

virtual char* ConnectServ(char* IP,int_port);

virtual bool DisConnectServ(int port);//斷開

virtual void SendData(char*data,int len);//發(fā)送

virtual char*RcvData();//接收

virtual void SetTimeout(int sec,int usec);

virtual void ReleaseBuf(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é)包括:首先使用Init()初始化Winsock,然后使用socket()函數(shù)創(chuàng)建socket,接下來可以使用ioctlsocket()設(shè)置非阻塞的連接方式,再使用bind()將該socket綁定到本地地址,使用con nect()向遠(yuǎn)程IPv4服務(wù)器發(fā)起連接請(qǐng)求,設(shè)置超時(shí)時(shí)間,并調(diào)用select()檢查是否可讀,成功后調(diào)用ioctlsocket()將該socket設(shè)置為阻塞模式。

2.1.3IPv6客戶端接口類的設(shè)計(jì)

與CClientv4類相類似,由類CClientv6來提供具體的實(shí)現(xiàn)IPv6通信的功能,該類也繼承自CClient(圖2),其所提供的public方法中包含了其父類CClient所規(guī)定的所有公共方法。與CClientv4類不同的是,其具體底層實(shí)現(xiàn)則參照IPv6下的socket函數(shù)使用方法來完成。

此類的方法ConnectServ()提供連接遠(yuǎn)程IPv6服務(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;接下來可以選用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ì)于用來完成網(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è)包的GetFirstRcv Data();用于刪除接收到的數(shù)據(jù)包鏈表中的第一個(gè)包的DelFirstRcvData();用于設(shè)置超時(shí)時(shí)間的SetTimeout();用于設(shè)置偵聽的最大連接數(shù)的SetMaxConn()等。多數(shù)方法被設(shè)計(jì)為virtual類型,以支持和實(shí)現(xiàn)在具體應(yīng)用中的動(dòng)態(tài)綁定。

class CSrvThread:public CThread

{

private:

……

public:

virtual void Start();//啟動(dòng)線程

virtual void Stop();//暫停線程

virtual void Release();//釋放資源

virtual char*GetFirstRcvData();

virtual void DelFirstData();

virtual void SetTimeout(long sec,long u_sec);

virtual void SetMaxConn(int maxconn);

……

};

值得注意的是,既可直接利用開發(fā)工具提供的線程類來作為類CThread使用,也可自行設(shè)計(jì)實(shí)現(xiàn)。

2.2.2IPv4服務(wù)器端接口類的設(shè)計(jì)

具體完成IPv4服務(wù)器端通信功能的接口類CSrvLst v4Thread繼承自父類CSrvThread,其所提供的接口方法包含了父類CSrvThread所規(guī)定的主要方法,具體底層實(shí)現(xiàn)則依照IPv4下socket函數(shù)的使用來進(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ù)器端通信功能的類CSrvLstv6 Thread也繼承自類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é)。

3方法分析與應(yīng)用舉例

使用此種設(shè)計(jì)方法,能夠使本文的面向雙棧的編程變得非常輕松,無須過多地考慮和處理涉及IPv6協(xié)議的細(xì)節(jié),就能使用與IPv4協(xié)議下的類似方法來編制程序,有效提高了開發(fā)效率。IPv4下的網(wǎng)絡(luò)編程和IPv6下的網(wǎng)絡(luò)編程幾乎可以做到一致。應(yīng)用實(shí)例如下:

void main()

{

……

CClient*com1=new CClientv4();//創(chuàng)建IPv4客戶端網(wǎng)絡(luò)組件

CClient*com2=new CClientv6();//創(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的使用方法也類似于上例,在此就不再舉例說明。采用這兩個(gè)模塊進(jìn)行網(wǎng)絡(luò)軟件開發(fā),不僅可以忽略由于IPv4/與IPv6不同協(xié)議差別造成的不同編程接口差異,方便開發(fā),同時(shí)支持IPv4/、IPv6雙協(xié)議棧的軟件系統(tǒng),而且編程人員還可以根據(jù)自己的實(shí)際需要來決定當(dāng)前是否實(shí)現(xiàn)其中的IPv4或IPv6通信功能,具有較強(qiáng)的可擴(kuò)展性。同時(shí),開發(fā)者只要在最開始處根據(jù)自己的具體需要(是利用IPv4通信還是利用IPv6通信),創(chuàng)建相應(yīng)的客戶端或服務(wù)器端組件(IPv4或IPv6),則以后就幾乎可以完全不用考慮自己是使用何種通信協(xié)議進(jìn)行通信,使程序員和用戶均能很快地適應(yīng)基于IPv6協(xié)議的開發(fā)與使用,易用性高。

最具遠(yuǎn)景意義的是,對(duì)于目前大多只支持IPv4通信的網(wǎng)絡(luò)軟件而言,本文所提出的設(shè)計(jì)方法提供了一個(gè)方便的向IPv6升級(jí)的解決方案。采用該方法,這些網(wǎng)絡(luò)軟件的原有功能和實(shí)現(xiàn)幾乎無須作過多修改,只需獨(dú)立地添加IPv6通信功能模塊以及設(shè)計(jì)和擴(kuò)充頂層通信模塊,就可以實(shí)現(xiàn)升級(jí)為支持雙棧通信的目標(biāo)。

4結(jié)束語

本文分析了一般的網(wǎng)絡(luò)系統(tǒng)的通信流程,結(jié)合一般的功能需求,利用類繼承設(shè)計(jì)了支持雙棧通信的模塊,并結(jié)合應(yīng)用實(shí)例進(jìn)行了解釋。本文對(duì)支持IPv4/IPv6雙棧的通信模塊設(shè)計(jì)方法進(jìn)行了分析,并詳細(xì)分析和描述了支持IPv4/IPv6的網(wǎng)絡(luò)通信模塊的設(shè)計(jì),結(jié)合實(shí)例分析和解釋了此種設(shè)計(jì)方法的長處。隨著基于IPv6的應(yīng)用需求日益增大,越來越多的網(wǎng)絡(luò)應(yīng)用系統(tǒng)要求提供對(duì)使用IPv4和IPv6通信的同時(shí)支持,本文所設(shè)計(jì)的模塊中提出的方法實(shí)用性在這些應(yīng)用系統(tǒng)的具體開發(fā)過程中將得到進(jìn)一步的體現(xiàn)。

參考文獻(xiàn):

[1]

RFC 791,Internet protocol[S].

[2]RFC 2460,Internet protocol,version 6 (IPv6)[S].

[3]MIGUEL T P de,CASTRO M.Programming guidelines on transition to IPv6[C]//Proc ofNAv6TF.2003:351-415.

[4]FIUCZYNSKI M E,LAM V K,BERSHAD B N.The design and implementation of an IPv6/IPv4 network address and protocol translator[C].[S.l.]:USENIX Press.1998:271-282.

[5]KATAGIRI H, HIRAKAWA K,HU J.Genetic:network programming:application to intelligent agents[C]//Proc ofIEEE.2000:3829-3834.

“本文中所涉及到的圖表、注解、公式等內(nèi)容請(qǐng)以PDF格式閱讀原文”

主站蜘蛛池模板: 综合色在线| 久久久精品无码一二三区| 亚洲一区二区精品无码久久久| 免费观看精品视频999| 一本一本大道香蕉久在线播放| 国产欧美成人不卡视频| 四虎影视8848永久精品| 91在线播放国产| 色欲色欲久久综合网| 亚洲国产日韩一区| 尤物成AV人片在线观看| 91精品啪在线观看国产| 美女高潮全身流白浆福利区| 国产亚洲精品无码专| 老司国产精品视频| 四虎在线观看视频高清无码| 91精品亚洲| 久久影院一区二区h| 亚洲午夜福利精品无码| 国产免费羞羞视频| 成人字幕网视频在线观看| 97av视频在线观看| 欧美人在线一区二区三区| 亚洲视频免| 亚洲Av激情网五月天| 成人在线观看不卡| 日韩精品一区二区三区免费| 久青草国产高清在线视频| 国产精品3p视频| 一本大道无码日韩精品影视| 亚洲精品国产日韩无码AV永久免费网 | 日韩精品免费一线在线观看| 福利在线不卡一区| 性69交片免费看| 国产色网站| 日韩精品一区二区三区中文无码| 国产亚洲欧美另类一区二区| 久草中文网| 就去色综合| 欧美精品v欧洲精品| 久久这里只有精品2| 国产亚洲精品在天天在线麻豆 | 欧美激情视频一区| 亚洲高清在线天堂精品| 中文字幕永久视频| 亚洲天堂网在线视频| 欧美日韩福利| 中字无码精油按摩中出视频| 人妻精品久久久无码区色视| 一本大道AV人久久综合| 国产一区二区福利| 国产网站免费看| 国产手机在线ΑⅤ片无码观看| 九色在线观看视频| 久久久久国产一级毛片高清板| 亚洲精品第1页| 国产欧美日韩免费| 91成人免费观看| 久久精品亚洲专区| 久久免费看片| 欧美午夜视频| 亚洲全网成人资源在线观看| 91麻豆国产视频| 99999久久久久久亚洲| 成人免费黄色小视频| 欧美伊人色综合久久天天| 亚洲男人天堂久久| 99久久精品国产麻豆婷婷| 欧美a在线看| 区国产精品搜索视频| 亚洲精品第一页不卡| 一本色道久久88综合日韩精品| 美女免费黄网站| 国产一区二区网站| 97se亚洲综合| 在线中文字幕日韩| 日本黄网在线观看| 亚洲色无码专线精品观看| 亚洲国产av无码综合原创国产| 亚洲欧美一区二区三区麻豆| 伊人久热这里只有精品视频99| 亚洲综合婷婷激情|