两个人的电影免费视频_国产精品久久久久久久久成人_97视频在线观看播放_久久这里只有精品777_亚洲熟女少妇二三区_4438x8成人网亚洲av_内谢国产内射夫妻免费视频_人妻精品久久久久中国字幕

一種基于SPI技術(shù)的服務(wù)器端應(yīng)用系統(tǒng)IPv4/IPv6過渡方法

文檔序號(hào):7620099閱讀:679來源:國知局
專利名稱:一種基于SPI技術(shù)的服務(wù)器端應(yīng)用系統(tǒng)IPv4/IPv6過渡方法
技術(shù)領(lǐng)域
本發(fā)明涉及服務(wù)器端應(yīng)用系統(tǒng)從IPv4過渡到IPv6的方法,特別涉及一種基于Microsoft Windows SPI技術(shù)的服務(wù)器端應(yīng)用系統(tǒng)的過渡方法。
背景技術(shù)
隨著互聯(lián)網(wǎng)的發(fā)展,新的網(wǎng)絡(luò)技術(shù)不斷涌現(xiàn)。IPv6技術(shù)正在取代IPv4技術(shù),成為構(gòu)筑下一代互聯(lián)網(wǎng)的核心技術(shù)。為了保證現(xiàn)有基于IPv4的應(yīng)用系統(tǒng)能夠很好地部署到下一代互聯(lián)網(wǎng)中,應(yīng)用系統(tǒng)的IPv4到IPv6過渡成為近幾年來人們普遍關(guān)注的問題。
由于IPv6協(xié)議使用128位的IP地址,而IPv4協(xié)議使用的是32位的IP地址,于是原先一些與IPv4協(xié)議相關(guān)的數(shù)據(jù)結(jié)構(gòu)和函數(shù)將無法適用于IPv6協(xié)議,其相應(yīng)的應(yīng)用系統(tǒng)也就不能在IPv6網(wǎng)絡(luò)環(huán)境下正常運(yùn)行。因此,有必要對(duì)一些基于IPv4協(xié)議的應(yīng)用系統(tǒng)進(jìn)行移植,以滿足使用IPv6協(xié)議的用戶的需求。
傳統(tǒng)的移植方法是基于源碼的移植?;谠创a的移植方案實(shí)際上是在IPv6環(huán)境下實(shí)現(xiàn)與IPv4相同的功能,從實(shí)現(xiàn)的角度來看,其難度依賴于原先系統(tǒng)的復(fù)雜程度,而且很可能會(huì)破壞原有軟件的體系結(jié)構(gòu),使得商家不得不重新發(fā)布新版軟件。因而這種方法不具有通用性。
而基于SPI的移植方法是借助中間件的思想設(shè)計(jì)的,應(yīng)用系統(tǒng)只需要安裝一個(gè)分層協(xié)議中間件即可實(shí)現(xiàn)移植,服務(wù)器端軟件無需進(jìn)行改動(dòng),因此具有較強(qiáng)的適用性。

發(fā)明內(nèi)容
針對(duì)現(xiàn)有技術(shù)存在不具有通用性的問題,本發(fā)明提供了一種基于SPI的移植方法,借助中間件思路設(shè)計(jì)的服務(wù)器端軟件無需進(jìn)行改動(dòng),具有較強(qiáng)通用性的IPv4/IPv6過渡方法。
本發(fā)明的服務(wù)器端應(yīng)用系統(tǒng)IPv4/IPv6過渡方法包括下列步驟一種服務(wù)器端應(yīng)用系統(tǒng)IPv4/IPv6的過渡方法,其特征在于包括下列步驟a、建立分層協(xié)議中間件;b、構(gòu)建分層協(xié)議轉(zhuǎn)發(fā)表;c、分層協(xié)議中間件獲取服務(wù)器端IPv4 Socket的地址和端口;d、分層協(xié)議中間件針對(duì)每個(gè)服務(wù)器端的IPv4 Socket,相應(yīng)地建立一個(gè)IPv6 Socket;e、如果客戶端使用IPv4協(xié)議向服務(wù)器端發(fā)出服務(wù)請(qǐng)求,則分層協(xié)議中間件不對(duì)數(shù)據(jù)進(jìn)行任何處理;f、如果客戶端使用IPv6協(xié)議向服務(wù)器端發(fā)出服務(wù)請(qǐng)求,分層協(xié)議中間件同時(shí)創(chuàng)建一個(gè)IPv4和IPv6 Socket,使用IPv4 Socket將客戶端的請(qǐng)求轉(zhuǎn)發(fā)給服務(wù)器端,并將服務(wù)器端的應(yīng)答通過相應(yīng)的IPv6Socket轉(zhuǎn)發(fā)給客戶端。
所述步驟d還包括由分層協(xié)議中間件創(chuàng)建的IPv6 Socket綁定與其到對(duì)應(yīng)的IPV4 Socket相同的端口的步驟。
所述步驟e還包括下列步驟e1、如果客戶端使用IPv4協(xié)議向服務(wù)器端發(fā)出服務(wù)請(qǐng)求,則分層協(xié)議中間件不對(duì)數(shù)據(jù)進(jìn)行任何處理,客戶端直接連接到原服務(wù)器創(chuàng)建的IPv4 Socket;e2、當(dāng)服務(wù)器的作出應(yīng)答時(shí),分層協(xié)議中間件不對(duì)數(shù)據(jù)進(jìn)行任何處理,服務(wù)器應(yīng)答直接發(fā)送給客戶端。
所述步驟f還包括下列步驟f1、當(dāng)客戶端發(fā)出服務(wù)請(qǐng)求時(shí),分層協(xié)議中間件根據(jù)客戶端連接的Socket,在分層協(xié)議轉(zhuǎn)發(fā)表中查找與之對(duì)應(yīng)的IPv4 Socket,將客戶端的請(qǐng)求通過IPv4 Socket發(fā)給服務(wù)器端;f2、當(dāng)服務(wù)器端做出應(yīng)答時(shí),分層協(xié)議中間件根據(jù)服務(wù)器端的IPv4Socket,在分層協(xié)議轉(zhuǎn)發(fā)表中查找與之對(duì)應(yīng)的IPv6 Socket,將服務(wù)器端的應(yīng)答通過IPv6 Socket發(fā)給客戶端。
所述分層協(xié)議中間件介于應(yīng)用程序和底層的基礎(chǔ)協(xié)議之間。
所述分層協(xié)議轉(zhuǎn)發(fā)表的每一個(gè)元素都是由一對(duì)SOCKET構(gòu)成的。
所述SOCKET一個(gè)是基于IPv4協(xié)議的,一個(gè)是基于IPv6協(xié)議的,并且它們是一一對(duì)應(yīng)的。
在分層協(xié)議中間件的作用下,服務(wù)器實(shí)現(xiàn)了與使用IPv6協(xié)議的客戶端的間接通信。對(duì)于服務(wù)器來說,它仍然只是提供基于IPv4協(xié)議的服務(wù),基于IPv6協(xié)議的服務(wù)是由分層協(xié)議中間件代其提供的。對(duì)于使用IPv6協(xié)議的客戶端而言,它根本不知道自己實(shí)際上是通過分層協(xié)議中間件同服務(wù)器間接的通訊。可見,這種設(shè)計(jì)方案在通信的過程中具有透明性。


圖1為在使用分層協(xié)議中間件的情況下客戶端與服務(wù)器端間接通信過程示意圖;圖2為分層協(xié)議轉(zhuǎn)發(fā)表結(jié)構(gòu)圖;圖3為WSPSocket、WSPBind和WSPListen三個(gè)函數(shù)的映射關(guān)系圖。
具體實(shí)施例方式
本發(fā)明提出的一種基于Windows SPI技術(shù)的服務(wù)器端應(yīng)用系統(tǒng)IPv4/IPv6過渡方法主要包括以下幾個(gè)核心技術(shù)分層協(xié)議中間件,分層協(xié)議轉(zhuǎn)發(fā)表。依照我們下面的參考附圖,對(duì)本發(fā)明的實(shí)施例進(jìn)行詳細(xì)的說明。
在分層協(xié)議中間件參與通信的情況下,分層協(xié)議剛好介于應(yīng)用程序和底層的基礎(chǔ)協(xié)議之間。對(duì)于服務(wù)器/客戶端模式的系統(tǒng)而言,服務(wù)器端的通信過程如下a.如果服務(wù)器端發(fā)送數(shù)據(jù)給客戶端,數(shù)據(jù)將由服務(wù)器端向下傳給分層協(xié)議,然后由分層協(xié)議轉(zhuǎn)交給基礎(chǔ)協(xié)議,再通過基礎(chǔ)協(xié)議發(fā)送給客戶端;b.如果是客戶端發(fā)送數(shù)據(jù)給服務(wù)器,數(shù)據(jù)會(huì)先由基礎(chǔ)協(xié)議接收,然后由基礎(chǔ)協(xié)議轉(zhuǎn)交給分層協(xié)議,再通過分層協(xié)議向上傳給服務(wù)器。
對(duì)于服務(wù)器創(chuàng)建的每一個(gè)基于IPv4協(xié)議的SOCKET,在分層協(xié)議中間件中都會(huì)相應(yīng)的建立一個(gè)基于IPv6協(xié)議的SOCKET,并且這兩個(gè)SOCKET都同時(shí)綁定到相同的端口。如果是使用IPv4協(xié)議的客戶端向服務(wù)器發(fā)出服務(wù)請(qǐng)求,則由服務(wù)器為其提供服務(wù)。如果是使用IPv6協(xié)議的客戶端向服務(wù)器發(fā)出服務(wù)請(qǐng)求,此時(shí)接到服務(wù)請(qǐng)求的將是分層協(xié)議中間件中創(chuàng)建的SOCKET,而不是服務(wù)器本身。
在分層協(xié)議中間件的作用下,服務(wù)器實(shí)現(xiàn)了與使用IPv6協(xié)議的客戶端的間接通信。對(duì)于服務(wù)器來說,它仍然只是提供基于IPv4協(xié)議的服務(wù),基于IPv6協(xié)議的服務(wù)是由分層協(xié)議中間件代其提供的。對(duì)于使用IPv6協(xié)議的客戶端而言,它根本不知道自己實(shí)際上是通過分層協(xié)議中間件同服務(wù)器間接的通訊??梢姡@種設(shè)計(jì)方案在通信的過程中具有透明性。
上述過程如圖1所示。
分層協(xié)議中間件只是充當(dāng)一個(gè)代理的角色,其工作是進(jìn)行數(shù)據(jù)的轉(zhuǎn)發(fā),但要實(shí)現(xiàn)轉(zhuǎn)發(fā)功能還必須建立一張轉(zhuǎn)發(fā)表,保證轉(zhuǎn)發(fā)過程的準(zhǔn)確無誤。
轉(zhuǎn)發(fā)表的每一個(gè)元素都由一對(duì)SOCKET構(gòu)成,一個(gè)是基于IPv4協(xié)議的,一個(gè)是基于IPv6協(xié)議的,并且它們是一一對(duì)應(yīng)的。所謂轉(zhuǎn)發(fā),可以這樣理解如果是基于IPv4協(xié)議的SOCKET收到數(shù)據(jù),則通過對(duì)應(yīng)的基于IPv6協(xié)議的SOCKET轉(zhuǎn)發(fā)出去;同樣的,如果是基于IPv6協(xié)議的SOCKET收到數(shù)據(jù),則通過對(duì)應(yīng)的基于IPv4協(xié)議的SOCKET轉(zhuǎn)發(fā)出去。轉(zhuǎn)發(fā)表的結(jié)構(gòu)如圖2所示。
為了方便,將分層協(xié)議中間件命名為IPv6Enable。IPv6Enable中設(shè)計(jì)了兩個(gè)分層協(xié)議,分別是針對(duì)基于TCP和UDP協(xié)議通信的服務(wù)器設(shè)計(jì)的。
typedef struct TCPSockPairNode{SOCKET ipv6;SOCKET IPv4;struct TCPSockPairNode*Next;}TCPSPN,*PTCPSPN;TCPSockPairNode是一個(gè)指針鏈表結(jié)構(gòu),用于存儲(chǔ)基于TCP協(xié)議的轉(zhuǎn)發(fā)表。ipv6存儲(chǔ)的是基于IPv6協(xié)議生成SOCKET的ID,由前面介紹可知,IPv6Enable對(duì)于使用IPv6協(xié)議的客戶端來說,它是一個(gè)服務(wù)器,在IPv6Enable應(yīng)答客戶端的連接請(qǐng)求時(shí)會(huì)自動(dòng)生成一個(gè)基于IPv6協(xié)議的SOCKET。IPv4存儲(chǔ)的是基于IPv4協(xié)議生成SOCKET的ID,因?yàn)镮Pv6Enable只是作為服務(wù)器的代理,真正的服務(wù)還必須由服務(wù)器提供,因此對(duì)于每一個(gè)客戶端的連接請(qǐng)求,IPv6Enable會(huì)相應(yīng)的建立一個(gè)基于IPv4協(xié)議的SOCKET,并以客戶端身份連接服務(wù)器,從而實(shí)現(xiàn)服務(wù)器能夠間接為使用IPv6協(xié)議的客戶端提供服務(wù)。Next是指向下一個(gè)鏈表節(jié)點(diǎn)的指針。
typedef struct UDPSockPairNode{
SOCKET ipv6;SOCKADDR_IN6 remoteaddr;int remoteaddrlen;SOCKET IPv4;SOCKADDR_IN localaddr;int localaddrlen;struct UDPSockPairNode*Next;}UDPSPN,*PUDPSPN;UDPSockPairNode是一個(gè)指針鏈表結(jié)構(gòu),用于存儲(chǔ)基于UDP協(xié)議的轉(zhuǎn)發(fā)表,由于UDP是無連接的協(xié)議,轉(zhuǎn)發(fā)表中不但要保存SOCKET的ID,而且還必須保存對(duì)應(yīng)的地址信息。ipv6存儲(chǔ)的是IPv6Enable所建立的基于IPv6協(xié)議SOCKET的ID,它與服務(wù)器創(chuàng)建的SOCKET是一一對(duì)應(yīng)的,并且它們都綁定到同一個(gè)端口。ipv6主要是用于區(qū)分服務(wù)器所提供的服務(wù),如果服務(wù)器只提供一種服務(wù),也就是只建立一個(gè)SOCKET,ipv6確實(shí)是毫無意義的。但是如果在服務(wù)器中提供兩種以上的服務(wù),它的作用就體現(xiàn)出來了。remoteaddr存儲(chǔ)的是使用IPv6協(xié)議客戶端的信息,確切的說是客戶端所建立的SOCKET的相關(guān)信息,包括其對(duì)應(yīng)的IP地址和端口。remoteaddrlen存儲(chǔ)的是remoteaddr成員所占用的字節(jié)數(shù)。IPv4存儲(chǔ)的是基于IPv4協(xié)議SOCKET的ID,IPv6Enable為每一個(gè)使用IPv6協(xié)議的客戶端都分別建立一個(gè)SOCKET,其作用是實(shí)現(xiàn)雙向通信功能。如果是客戶端提出服務(wù)請(qǐng)求,IPv6Enable就通過IPv4向服務(wù)器轉(zhuǎn)發(fā)服務(wù)請(qǐng)求;如果是服務(wù)器需要向客戶端返回處理數(shù)據(jù),IPv6Enable首先通過IPv4將數(shù)據(jù)接收,然后通過ipv6向客戶端轉(zhuǎn)發(fā)。localaddr存儲(chǔ)的是服務(wù)器的所在主機(jī)信息,確切的說應(yīng)該是服務(wù)器中創(chuàng)建的SOCKET的相關(guān)信息。localaddrlen存儲(chǔ)的是localaddr成員所占用的字節(jié)數(shù)。Next是指向下一個(gè)鏈表節(jié)點(diǎn)的指針。這個(gè)數(shù)據(jù)結(jié)構(gòu)實(shí)際上存儲(chǔ)了通信雙方的主機(jī)地址和端口,并將UDP作為默認(rèn)的通信協(xié)議,可以認(rèn)為是一個(gè)網(wǎng)間通信的全相關(guān)。
typedef struct IPv4SockInfo{SOCKET Sock;int Port;int SockType;}IPv4Sock;IPv4SockInfo結(jié)構(gòu)存儲(chǔ)了服務(wù)器所創(chuàng)建的SOCKET的相關(guān)信息。Sock存儲(chǔ)的是服務(wù)器所創(chuàng)建SOCKET的ID;Port存儲(chǔ)的是SOCKET所綁定的端口;SockType存儲(chǔ)的是創(chuàng)建SOCKET時(shí)使用的協(xié)議,其內(nèi)容是TCP或者UDP。
typedef struct SockTypeInfo{SOCKET Sock;int SockType;
struct SockTypeInfo*Next;}STI,*PSTI;SockTypeInfo結(jié)構(gòu)是一個(gè)指針鏈表,是用于存儲(chǔ)通過IPv6Enable創(chuàng)建的所有SOCKET的信息。Sock存儲(chǔ)的是SOCKET的ID。SockType存儲(chǔ)的是創(chuàng)建SOCKET時(shí)使用的協(xié)議,其內(nèi)容是TCP或者UDP。Next是指向下一個(gè)鏈表節(jié)點(diǎn)的指針。
SockTypeInfo結(jié)構(gòu)與IPv4SockInfo結(jié)構(gòu)看起來是比較相似的,其區(qū)別在于IPv4SockInfo結(jié)構(gòu)增加了一個(gè)Port成員。原因在于IPv4SockInfo只存儲(chǔ)那些與固定端口綁定的SOCKET的相關(guān)信息,也就是服務(wù)器所創(chuàng)建的SOCKET的信息,自然端口號(hào)碼是必不可少的;而SockTypeInfo存儲(chǔ)的是通過IPv6Enable創(chuàng)建的所有SOCKET的信息,包括服務(wù)器和客戶端創(chuàng)建的SOCKET。設(shè)計(jì)SockTypeInfo的主要目的是保存創(chuàng)建SOCKET時(shí)使用的協(xié)議信息(UDP或者TCP),因?yàn)閷?duì)于TCP和UDP協(xié)議而言,它們的通信方式是不同的,必須采用不同的轉(zhuǎn)發(fā)機(jī)制。實(shí)際上,SockTypeInfo結(jié)構(gòu)是為IPv4SockInfo結(jié)構(gòu)服務(wù)的,它們都有一個(gè)SockType成員,但I(xiàn)Pv4SockInfo結(jié)構(gòu)中SockType成員的內(nèi)容是通過SockTypeInfo結(jié)構(gòu)獲得的。這種設(shè)計(jì)是由SOCKET的通信機(jī)制決定的。因?yàn)橹挥性赟OCKET建立的時(shí)候才可能獲得創(chuàng)建SOCKET使用的協(xié)議,而IPv6Enable只是關(guān)心那些與固定端口綁定的SOCKET,但是SOCKET的綁定操作是在SOCKET建立好的基礎(chǔ)上完成的,也就是說,如果要在SOCKET與固定端口綁定的時(shí)候再去獲取創(chuàng)建SOCKET使用的協(xié)議,那是不可能實(shí)現(xiàn)的。所以,必須專門設(shè)計(jì)一個(gè)SockTypeInfo結(jié)構(gòu)的鏈表,在SOCKET創(chuàng)建的時(shí)候?qū)OCKET的ID連同協(xié)議一起保存起來,在SOCKET與固定端口綁定的時(shí)候就可以通過查詢這個(gè)鏈表獲得創(chuàng)建SOCKET時(shí)所使用的協(xié)議。
在IPv6Enable中大多數(shù)的數(shù)據(jù)結(jié)構(gòu)都是采用指針鏈表設(shè)計(jì)的,之所以選擇指針鏈表,是基于以下幾點(diǎn)考慮的。第一,指針鏈表能夠快速的進(jìn)行插入和刪除操作,比較適合于那些插入和刪除操作較為頻繁的場(chǎng)合。第二,指針鏈表的長度不是固定的,可以根據(jù)實(shí)際需要擴(kuò)大和縮小,使得內(nèi)存資源能夠有效的利用。第三,指針鏈表的數(shù)據(jù)元素是在堆中動(dòng)態(tài)分配內(nèi)存空間的,相對(duì)于使用靜態(tài)內(nèi)存分配策略的數(shù)據(jù)結(jié)構(gòu)而言,指針鏈表可以極大程度的滿足用戶的需求。
D11Main函數(shù)的實(shí)現(xiàn)D11Main是每一個(gè)動(dòng)態(tài)連接庫缺省的入口函數(shù),負(fù)責(zé)動(dòng)態(tài)連接庫的初始化和結(jié)束工作。在IPv6Enable中SOCKET采用的是異步消息機(jī)制進(jìn)行通信,所以必須將SOCKET的通信事件向某個(gè)特定的窗口注冊(cè),通過窗口的消息機(jī)制去捕獲SOCKET的相關(guān)事件,進(jìn)而完成相應(yīng)的操作。對(duì)于窗口的創(chuàng)建和銷毀,放在D11Main函數(shù)中應(yīng)該是比較合理的。當(dāng)動(dòng)態(tài)連接庫被載入內(nèi)存時(shí),首先根據(jù)實(shí)際需要定義一個(gè)窗口類,然后將窗口類向系統(tǒng)注冊(cè),如果注冊(cè)成功那么就可以創(chuàng)建窗口,此后窗口的所有消息都會(huì)交給指定的回調(diào)函數(shù),也就是消息處理函數(shù)處理。由于IPv6Enable中大多數(shù)的數(shù)據(jù)結(jié)構(gòu)的內(nèi)存空間都是動(dòng)態(tài)分配的,因此在動(dòng)態(tài)連接庫從內(nèi)存中卸載之前,還必須完成一系列的善后工作,一方面是銷毀動(dòng)態(tài)連接庫載入時(shí)所創(chuàng)建的窗口,另一方面是銷毀SOCKET信息列表和轉(zhuǎn)發(fā)表,避免內(nèi)存泄露的發(fā)生。
WSPStartup函數(shù)的實(shí)現(xiàn)WSPStartup是每一個(gè)服務(wù)中間件的初始化函數(shù)。當(dāng)Winsock2應(yīng)用程序調(diào)用WSPStartup函數(shù)的時(shí)候,ws2_32.d11首先尋找相應(yīng)的服務(wù)中間件,并加載服務(wù)中間件對(duì)應(yīng)的DLL到系統(tǒng)中去的,然后調(diào)用WSPStartup函數(shù)來初始化。WSPStartup函數(shù)有一個(gè)LPWSAPROTOCOL_INFOW類型的參數(shù),它提供了應(yīng)用程序所期望的協(xié)議信息,對(duì)于分層協(xié)議而言,通過這個(gè)參數(shù)可以獲得協(xié)議鏈中分層協(xié)議的下一層協(xié)議,由于IPv6Enable定制的每一個(gè)協(xié)議鏈只有兩個(gè)協(xié)議,因此下一層協(xié)議就是基礎(chǔ)協(xié)議。于是獲得了基礎(chǔ)協(xié)議XXXXXX(系統(tǒng)自帶的XXXXXX)的名稱和路徑,然后加載基礎(chǔ)協(xié)議服務(wù)中間件到系統(tǒng)中,通過查找基礎(chǔ)協(xié)議服務(wù)中間件的WSPStartup函數(shù)指針,就實(shí)現(xiàn)了將分層協(xié)議中間件的WSPStartup函數(shù)和基礎(chǔ)協(xié)議服務(wù)中間件的WSPStartup函數(shù)相關(guān)聯(lián),進(jìn)而可以調(diào)用基礎(chǔ)協(xié)議服務(wù)中間件的函數(shù)。也就是說,分層協(xié)議的作用只是根據(jù)需要對(duì)通信的過程進(jìn)行一些適當(dāng)?shù)男揎?,?shí)際的通信功能還需要由基礎(chǔ)協(xié)議來實(shí)現(xiàn)。WSPStartup函數(shù)中有一個(gè)LPWSPPROC_TABLE類型的參數(shù),實(shí)際上是一張函數(shù)派遣表,其作用是為上層函數(shù)調(diào)用指定函數(shù)實(shí)現(xiàn)。應(yīng)用程序中調(diào)用的只是函數(shù)的接口,其對(duì)應(yīng)的函數(shù)實(shí)現(xiàn)則由WSPStartup函數(shù)指派。分層協(xié)議中間件對(duì)函數(shù)進(jìn)行重定義是通過修改函數(shù)派遣表來實(shí)現(xiàn)的,IPv6Enable主要針對(duì)WSPSocket、WSPBind和WSPListen三個(gè)函數(shù)進(jìn)行重定義,函數(shù)映射關(guān)系如圖3所示,具體實(shí)現(xiàn)細(xì)節(jié)將在下面詳細(xì)討論。
WSPSocket函數(shù)的實(shí)現(xiàn)WSPSocket函數(shù)的主要功能是創(chuàng)建SOCKET,當(dāng)應(yīng)用程序調(diào)用socket函數(shù)或者WSASocket函數(shù)的時(shí)候,實(shí)際上是調(diào)用了服務(wù)中間件的WSPSocket函數(shù)。IPv6Enable重定義WSPSocket函數(shù)的目的是獲取每一個(gè)SOCKET在創(chuàng)建時(shí)使用的協(xié)議,其工作過程如下首先通過調(diào)用基礎(chǔ)協(xié)議對(duì)應(yīng)的服務(wù)中間件的WSPSocket函數(shù),為上層的應(yīng)用程序建立一個(gè)SOCKET;接著將SOCKET信息列表鎖定;然后將所創(chuàng)建SOCKET的ID和創(chuàng)建SOCKET使用的協(xié)議加入SOCKET信息列表;最后將SOCKET信息列表解除鎖定。SOCKET信息列表實(shí)際上是前面介紹的SockTypeInfo結(jié)構(gòu)的指針鏈表,它的主要作用是保存創(chuàng)建SOCKET時(shí)使用的協(xié)議。
WSPBind函數(shù)的實(shí)現(xiàn)WSPBind函數(shù)的主要功能是將SOCKET同主機(jī)地址以及端口進(jìn)行綁定,當(dāng)應(yīng)用程序調(diào)用bind函數(shù)的時(shí)候,實(shí)際上是調(diào)用了服務(wù)中間件的WSPBind函數(shù)。IPv6Enable重定義WSPBind函數(shù)的目的是獲取服務(wù)器提供的基于IPv4協(xié)議的服務(wù),從而IPv6Enable能夠代理服務(wù)器提供基于IPv6協(xié)議的服務(wù)。WSPBind函數(shù)的主要流程如下首先查找SOCKET信息列表,獲得創(chuàng)建SOCKET使用的協(xié)議;接著根據(jù)相應(yīng)的協(xié)議創(chuàng)建一個(gè)基于IPv6協(xié)議的SOCKET,并將SOCKET綁定到與服務(wù)器相同的端口,同時(shí)調(diào)用基礎(chǔ)協(xié)議對(duì)應(yīng)的服務(wù)中間件的WSPBind函數(shù),完成服務(wù)器同服務(wù)端口的綁定操作。至此,基于IPv4協(xié)議和基于IPv6協(xié)議的SOCKET都已經(jīng)成功建立并且綁定到相同的端口。對(duì)于上述兩個(gè)SOCKET之間存在的一一對(duì)應(yīng)關(guān)系,IPv6Enable是通過數(shù)組來表示這種映射關(guān)系的,并且這種映射關(guān)系的建立也是在WSPBind函數(shù)中完成的。IPv6Enable為基于IPv4協(xié)議和基于IPv6協(xié)議的SOCKET都分別建立一個(gè)數(shù)組,其對(duì)應(yīng)關(guān)系是通過數(shù)組下標(biāo)來表示的,也就是說這兩個(gè)SOCKET的信息在它們各自數(shù)組中的存儲(chǔ)位置是相同的。對(duì)于基于IPv4協(xié)議的SOCKET,IPv6Enable存儲(chǔ)了SOCKET的ID、SOCKET綁定的端口和建立SOCKET使用的協(xié)議。對(duì)于基于IPv6協(xié)議的SOCKET,只存儲(chǔ)SOCKET的ID,因?yàn)樯鲜鰞蓚€(gè)SOCKET綁定的端口和建立時(shí)使用的協(xié)議都是相同的。如果服務(wù)器使用的是UDP協(xié)議,那么在SOCKET完成綁定之后服務(wù)器就可以向客戶端提供服務(wù)了,但是在提供服務(wù)之前SOCKET還應(yīng)該通過WSAAsyncSelect函數(shù)向特定的窗口(即D11Main函數(shù)中建立的窗口)注冊(cè)網(wǎng)絡(luò)事件,因?yàn)镮Pv6Enable是基于SOCKET的異步消息機(jī)制設(shè)計(jì)的。每當(dāng)SOCKET觸發(fā)設(shè)定的網(wǎng)絡(luò)事件,都會(huì)向指定窗口發(fā)送一個(gè)消息,這個(gè)消息包括產(chǎn)生網(wǎng)絡(luò)事件的SOCKET、發(fā)生的事件類型和錯(cuò)誤碼。對(duì)于使用UDP協(xié)議的SOCKET,IPv6Enable主要是關(guān)心FD_READ事件,F(xiàn)D_READ事件當(dāng)數(shù)據(jù)到達(dá)SOCKET時(shí)觸發(fā),IPv6Enable就是通過對(duì)FD_READ事件的捕獲實(shí)現(xiàn)數(shù)據(jù)轉(zhuǎn)發(fā),而實(shí)際上數(shù)據(jù)的接收和轉(zhuǎn)發(fā)操作是在窗口的回調(diào)函數(shù)中完成的。如果服務(wù)器使用的是TCP協(xié)議,SOCKET在完成綁定之后還必須置于監(jiān)聽狀態(tài),才能向客戶端提供服務(wù),監(jiān)聽操作的具體實(shí)現(xiàn)將在下面介紹。
WSPListen函數(shù)的實(shí)現(xiàn)WSPListen是基于TCP協(xié)議通信的SOCKET的專有函數(shù),它的主要功能是將SOCKET置于監(jiān)聽狀態(tài),這意味著SOCKET開始為客戶端提供服務(wù)。當(dāng)應(yīng)用程序調(diào)用listen函數(shù)的時(shí)候,實(shí)際上是調(diào)用了服務(wù)中間件的WSPListen函數(shù)。IPv6Enable重定義WSPListen函數(shù)的目的是將基于IPv4協(xié)議和基于IPv6協(xié)議的SOCKET同時(shí)置于監(jiān)聽狀態(tài),從而能夠?yàn)槭褂肐Pv4和IPv6協(xié)議的客戶端服務(wù)?;贗Pv4協(xié)議的SOCKET是服務(wù)器創(chuàng)建的,而基于IPv6協(xié)議的SOCKET是由IPv6Enable創(chuàng)建的,并且它們?cè)赪SPBind函數(shù)中已經(jīng)建立了映射關(guān)系。WSPListen函數(shù)可以直接得到服務(wù)器創(chuàng)建的SOCKET,至于由IPv6Enable創(chuàng)建的基于IPv6協(xié)議的SOCKET必須通過映射關(guān)系獲得。由前面介紹可知,這兩個(gè)SOCKET是分別存儲(chǔ)在兩個(gè)數(shù)組中的,其映射關(guān)系是通過相同的數(shù)組下標(biāo)來實(shí)現(xiàn)的。WSPListen函數(shù)的主要流程如下首先通過查詢獲得基于IPv4協(xié)議的SOCKET在數(shù)組中的存儲(chǔ)位置,然后在對(duì)應(yīng)的數(shù)組中獲得由IPv6Enable創(chuàng)建的基于IPv6協(xié)議的SOCKET,接著調(diào)用listen函數(shù)將其置于監(jiān)聽狀態(tài),最后調(diào)用基礎(chǔ)協(xié)議對(duì)應(yīng)的服務(wù)中間件的WSPListen函數(shù),將服務(wù)器建立的SOCKET置于監(jiān)聽狀態(tài)。同樣的道理,基于IPv6協(xié)議的SOCKET在開始提供服務(wù)之前還應(yīng)該調(diào)用WSAAsyncSelect函數(shù)向特定的窗口注冊(cè)網(wǎng)絡(luò)事件。對(duì)于使用TCP協(xié)議的SOCKET,IPv6Enable主要是關(guān)心FD_READ、FD_ACCEPT和FD_CLOSE事件。FD_READ事件當(dāng)數(shù)據(jù)到達(dá)SOCKET時(shí)觸發(fā),IPv6Enable就是通過對(duì)FD_READ事件的捕獲實(shí)現(xiàn)數(shù)據(jù)轉(zhuǎn)發(fā)的。FD_ACCEPT事件當(dāng)客戶端向服務(wù)器提出連接請(qǐng)求時(shí)觸發(fā),IPv6Enable就是通過對(duì)FD_ACCEPT事件的捕獲增加基于TCP協(xié)議的轉(zhuǎn)發(fā)表項(xiàng)。FD_CLOSE事件當(dāng)客戶端與服務(wù)器斷開連接時(shí)觸發(fā),IPv6Enable就是通過對(duì)FD_CLOSE事件的捕獲刪除轉(zhuǎn)發(fā)表項(xiàng)的。IPv6Enable對(duì)SOCKET網(wǎng)絡(luò)事件的處理如果SOCKET注冊(cè)的網(wǎng)絡(luò)事件發(fā)生,那么窗口會(huì)收到一條Windows消息,消息的ID是在注冊(cè)SOCKET網(wǎng)絡(luò)事件時(shí)指定的。消息的wParam參數(shù)代表產(chǎn)生網(wǎng)絡(luò)事件的SOCKET,lParam參數(shù)代表發(fā)生的事件類型。下面將詳細(xì)介紹不同網(wǎng)絡(luò)事件的處理過程。
如果SOCKET是基于TCP協(xié)議創(chuàng)建的,IPv6Enable主要關(guān)心三種網(wǎng)絡(luò)事件,它們是FD_READ、FD_ACCEPT和FD_CLOSE。FD_ACCEPT事件當(dāng)客戶端向服務(wù)器提出連接請(qǐng)求時(shí)觸發(fā),對(duì)于每一個(gè)捕獲的FD_ACCEPT事件,IPv6Enable將增加相應(yīng)的轉(zhuǎn)發(fā)表項(xiàng),其具體過程如下1、調(diào)用accept函數(shù),應(yīng)答使用IPv6協(xié)議的客戶端的連接請(qǐng)求,如果accept函數(shù)函數(shù)調(diào)用成功,將自動(dòng)生成一個(gè)基于IPv6協(xié)議的SOCKET;2、調(diào)用socket函數(shù),新建一個(gè)基于IPv4協(xié)議的SOCKET;3、利用新建的SOCKET連接服務(wù)器;4、調(diào)用WSAAsyncSelect函數(shù)為新建的SOCKET注冊(cè)網(wǎng)絡(luò)事件;5、增加一個(gè)轉(zhuǎn)發(fā)表項(xiàng),保存上述兩個(gè)SOCKET。
對(duì)于第3步,需要獲得服務(wù)器的主機(jī)地址和服務(wù)端口,由于IPv6Enable與服務(wù)器位于同一臺(tái)主機(jī),所以主機(jī)地址使用本地回環(huán)地址(127.0.0.1),而服務(wù)端口是通過在WSPBind函數(shù)中建立的映射關(guān)系獲得的。對(duì)于第4步,如果不進(jìn)行網(wǎng)絡(luò)事件注冊(cè),則只能是單向通信。這也就是說,只能由使用IPv6協(xié)議的客戶端通過IPv6Enable將數(shù)據(jù)轉(zhuǎn)發(fā)給的服務(wù)器,服務(wù)器是無法將數(shù)據(jù)通過IPv6Enable反饋到客戶端的,原因是IPv6Enable無法捕獲數(shù)據(jù)到達(dá)事件,自然也就不能實(shí)現(xiàn)數(shù)據(jù)的接收和轉(zhuǎn)發(fā)。FD_READ事件當(dāng)SOCKET收到數(shù)據(jù)時(shí)觸發(fā),對(duì)于每一個(gè)捕獲的FD_READ事件,IPv6Enable通過查找轉(zhuǎn)發(fā)表,執(zhí)行轉(zhuǎn)發(fā)操作,其具體過程如下1、將轉(zhuǎn)發(fā)表的每一項(xiàng)逐個(gè)跟消息的wParam參數(shù)比較,找到匹配的轉(zhuǎn)發(fā)表項(xiàng);2、向系統(tǒng)申請(qǐng)緩沖區(qū)空間;3、接收數(shù)據(jù),然后執(zhí)行轉(zhuǎn)發(fā)操作;4、將緩沖區(qū)空間歸還系統(tǒng)。
對(duì)于第3步,如果是基于IPv4協(xié)議的SOCKET收到消息,則通過對(duì)應(yīng)的基于IPv6協(xié)議的SOCKET轉(zhuǎn)發(fā);反過來,如果是基于IPv6協(xié)議的SOCKET收到消息,則通過對(duì)應(yīng)的基于IPv4協(xié)議的SOCKET轉(zhuǎn)發(fā)。FD_CLOSE事件當(dāng)客戶端與服務(wù)器斷開連接時(shí)觸發(fā),對(duì)于每一個(gè)捕獲的FD_CLOSE事件,IPv6Enable通過查找轉(zhuǎn)發(fā)表,刪除相應(yīng)的轉(zhuǎn)發(fā)表項(xiàng)。
如果SOCKET是基于UDP協(xié)議創(chuàng)建的,IPv6Enable只關(guān)心FD_READ網(wǎng)絡(luò)事件,因?yàn)閁DP是無連接的協(xié)議。FD_READ事件當(dāng)SOCKET收到數(shù)據(jù)時(shí)觸發(fā),對(duì)于每一個(gè)捕獲的FD_READ事件,IPv6Enable將進(jìn)行如下處理1、向系統(tǒng)申請(qǐng)緩沖區(qū)空間;2、接收數(shù)據(jù),并獲得源發(fā)送端的相關(guān)信息;3、查找轉(zhuǎn)發(fā)表,根據(jù)查找結(jié)果進(jìn)行相應(yīng)處理并執(zhí)行轉(zhuǎn)發(fā)操作;4、將緩沖區(qū)空間歸還系統(tǒng)。
對(duì)于第3步,如果在轉(zhuǎn)發(fā)表中能夠查到匹配的表項(xiàng),則立即執(zhí)行轉(zhuǎn)發(fā)操作。如果是基于IPv4協(xié)議的SOCKET收到消息,則通過對(duì)應(yīng)的基于IPv6協(xié)議的SOCKET轉(zhuǎn)發(fā);反過來,如果是基于IPv6協(xié)議的SOCKET收到消息,則通過對(duì)應(yīng)的基于IPv4協(xié)議的SOCKET轉(zhuǎn)發(fā)。如果轉(zhuǎn)發(fā)表中沒有匹配的表項(xiàng),說明是第一次通信,必須為其建立相應(yīng)的轉(zhuǎn)發(fā)表項(xiàng),然后再執(zhí)行轉(zhuǎn)發(fā)操作。轉(zhuǎn)發(fā)表項(xiàng)建立的具體過程如下首先,建立一個(gè)基于IPv4協(xié)議的SOCKET,這個(gè)SOCKET是用來與服務(wù)器通信的。其次,為新建的SOCKET注冊(cè)網(wǎng)絡(luò)事件,這樣IPv6Enable才能捕獲網(wǎng)絡(luò)事件并執(zhí)行轉(zhuǎn)發(fā)操作。再次,獲得服務(wù)器的主機(jī)地址和服務(wù)端口,同樣主機(jī)地址是使用本地回環(huán)地址(127.0.0.1),而服務(wù)端口是通過在WSPBind函數(shù)中建立的映射關(guān)系獲得的。最后,填充轉(zhuǎn)發(fā)表項(xiàng)的具體內(nèi)容并加入轉(zhuǎn)發(fā)表。
對(duì)于本領(lǐng)域的普通技術(shù)人員來說可顯而易見的得出其他優(yōu)點(diǎn)和修改。因此,具有更廣方面的本發(fā)明并不局限于這里所示出的并且所描述的具體說明及示例性實(shí)施例。因此,在不脫離由隨后權(quán)利要求及其等價(jià)體所定義的一般發(fā)明構(gòu)思的精神和范圍的情況下,可對(duì)其作出各種修改。
權(quán)利要求
1.一種服務(wù)器端應(yīng)用系統(tǒng)IPv4/IPv6的過渡方法,其特征在于包括下列步驟a、建立分層協(xié)議中間件;b、構(gòu)建分層協(xié)議轉(zhuǎn)發(fā)表;c、分層協(xié)議中間件獲取服務(wù)器端IPv4 Socket的地址和端口;d、分層協(xié)議中間件針對(duì)每個(gè)服務(wù)器端的IPv4 Socket,相應(yīng)地建立一個(gè)IPv6 Socket;e、如果客戶端使用IPv4協(xié)議向服務(wù)器端發(fā)出服務(wù)請(qǐng)求,則分層協(xié)議中間件不對(duì)數(shù)據(jù)進(jìn)行任何處理;f、如果客戶端使用IPv6協(xié)議向服務(wù)器端發(fā)出服務(wù)請(qǐng)求,分層協(xié)議中間件同時(shí)創(chuàng)建一個(gè)IPv4和IPv6 Socket,使用IPv4 Socket將客戶端的請(qǐng)求轉(zhuǎn)發(fā)給服務(wù)器端,并將服務(wù)器端的應(yīng)答通過相應(yīng)的IPv6Socket轉(zhuǎn)發(fā)給客戶端。
2.如權(quán)利要求1所述的方法,其特征在于所述步驟d還包括由分層協(xié)議中間件創(chuàng)建的IPv6 Socket綁定與其到對(duì)應(yīng)的IPV4 Socket相同的端口的步驟。
3.如權(quán)利要求1所述的方法,其特征在于所述步驟e還包括下列步驟e1、如果客戶端使用IPv4協(xié)議向服務(wù)器端發(fā)出服務(wù)請(qǐng)求,則分層協(xié)議中間件不對(duì)數(shù)據(jù)進(jìn)行任何處理,客戶端直接連接到原服務(wù)器創(chuàng)建的IPv4 Socket;e2、當(dāng)服務(wù)器的作出應(yīng)答時(shí),分層協(xié)議中間件不對(duì)數(shù)據(jù)進(jìn)行任何處理,服務(wù)器應(yīng)答直接發(fā)送給客戶端。
4.如權(quán)利要求1所述的方法,其特征在于所述步驟f還包括下列步驟f1、當(dāng)客戶端發(fā)出服務(wù)請(qǐng)求時(shí),分層協(xié)議中間件根據(jù)客戶端連接的Socket,在分層協(xié)議轉(zhuǎn)發(fā)表中查找與之對(duì)應(yīng)的IPv4 Socket,將客戶端的請(qǐng)求通過IPv4 Socket發(fā)給服務(wù)器端;f2、當(dāng)服務(wù)器端做出應(yīng)答時(shí),分層協(xié)議中間件根據(jù)服務(wù)器端的IPv4Socket,在分層協(xié)議轉(zhuǎn)發(fā)表中查找與之對(duì)應(yīng)的IPv6 Socket,將服務(wù)器端的應(yīng)答通過IPv6 Socket發(fā)給客戶端。
5.如權(quán)利要求1所述的方法,其特征在于所述分層協(xié)議中間件介于應(yīng)用程序和底層的基礎(chǔ)協(xié)議之間。
6.如權(quán)利要求1所述的方法,其特征在于所述分層協(xié)議轉(zhuǎn)發(fā)表的每一個(gè)元素都是由一對(duì)SOCKET構(gòu)成的。
7.如權(quán)利要求6所述的方法,其特征在于所述SOCKET一個(gè)是基于IPv4協(xié)議的,一個(gè)是基于IPv6協(xié)議的,并且它們是一一對(duì)應(yīng)的。
全文摘要
本發(fā)明提出了一種服務(wù)器端應(yīng)用系統(tǒng)(以下簡稱“服務(wù)器端”)IPv4/IPv6過渡方法,并具體包括以下步驟分層協(xié)議中間件獲取服務(wù)器端用于服務(wù)監(jiān)聽的IPv4 Socket的地址和端口;分層協(xié)議中間件針對(duì)每個(gè)服務(wù)器端用于監(jiān)聽的IPv4 Socket,相應(yīng)地建立一個(gè)IPv6 Socket;如果客戶端使用IPv4協(xié)議向服務(wù)器端發(fā)出服務(wù)請(qǐng)求,則分層協(xié)議中間件不對(duì)數(shù)據(jù)進(jìn)行任何處理;如果客戶端使用IPv6協(xié)議向服務(wù)器端發(fā)出服務(wù)請(qǐng)求,分層協(xié)議中間件同時(shí)創(chuàng)建一個(gè)IPv4和IPv6 Socket,使用IPv4 Socket將客戶端的請(qǐng)求轉(zhuǎn)發(fā)給服務(wù)器端,并將服務(wù)器端的應(yīng)答通過相應(yīng)的IPv6 Socket轉(zhuǎn)發(fā)給客戶端。在分層協(xié)議中間件的作用下,服務(wù)器實(shí)現(xiàn)了與使用IPv6協(xié)議的客戶端的間接通信,并且通信的過程中具有透明性。
文檔編號(hào)H04L29/06GK1893423SQ20051008079
公開日2007年1月10日 申請(qǐng)日期2005年7月5日 優(yōu)先權(quán)日2005年7月5日
發(fā)明者李智偉, 王劍白, 李未 申請(qǐng)人:北京航空航天大學(xué)
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
开封县| 平陆县| 镇安县| 宣武区| 永宁县| 永昌县| 辽阳县| 阿图什市| 枣庄市| 蚌埠市| 无锡市| 定安县| 烟台市| 斗六市| 延川县| 英吉沙县| 新乡县| 瑞昌市| 北辰区| 西峡县| 泾源县| 卫辉市| 施甸县| 新兴县| 嘉善县| 屏东县| 黑山县| 湄潭县| 宿松县| 尉氏县| 两当县| 黄石市| 建平县| 柳州市| 兴安盟| 搜索| 苍山县| 深水埗区| 巨野县| 漠河县| 武平县|