一種網(wǎng)絡(luò)接口模式和基于該網(wǎng)絡(luò)接口模式的數(shù)據(jù)通信方法
【專利摘要】本發(fā)明所述的網(wǎng)絡(luò)接口模式和基于該網(wǎng)絡(luò)接口模式的數(shù)據(jù)通信方法,采用一個(gè)統(tǒng)一的網(wǎng)絡(luò)接口模式PROACTOR,實(shí)現(xiàn)用戶端與TCP/IP網(wǎng)絡(luò)層之間的數(shù)據(jù)傳輸,用戶端利用網(wǎng)絡(luò)接口模式PROACTOR編寫網(wǎng)絡(luò)程序時(shí),只需一份代碼,用戶端每個(gè)使用網(wǎng)絡(luò)的程序就可以在WINDOWS平臺(tái)下和LINUX平臺(tái)下都能使用。
【專利說明】一種網(wǎng)絡(luò)接口模式和基于該網(wǎng)絡(luò)接口模式的數(shù)據(jù)通信方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及網(wǎng)絡(luò)通訊【技術(shù)領(lǐng)域】,具體地涉及一種網(wǎng)絡(luò)接口模式和基于該網(wǎng)絡(luò)接口模式的數(shù)據(jù)通信方法。
【背景技術(shù)】
[0002]隨著網(wǎng)絡(luò)技術(shù)的不斷普及,很多應(yīng)用程序都會(huì)涉及到TCP/IP網(wǎng)絡(luò),如何有效地,快速地開發(fā)出穩(wěn)定,健壯,可擴(kuò)展,高性能的網(wǎng)絡(luò)程序是所有程序員都面臨的問題。
[0003]傳統(tǒng)的網(wǎng)絡(luò)接口模式通常采用SELECT模式和POLL模式,SELECT模式和POLL模式都是內(nèi)部使用輪詢的方式去遍歷每個(gè)SOCKET的數(shù)據(jù)信息,這樣在大量網(wǎng)絡(luò)連接少量請(qǐng)求的時(shí)候會(huì)造成CPU空轉(zhuǎn)的現(xiàn)象,效率低下,而且采用SELECT模式時(shí),會(huì)有一個(gè)最大的SOCKET個(gè)數(shù)為1024的限制,所以傳統(tǒng)的SELECT模式和POLL模式通過輪詢?nèi)ビ|發(fā)網(wǎng)絡(luò)事件已經(jīng)不足以滿足現(xiàn)代服務(wù)器和應(yīng)用程序在性能方面的需求。
[0004]WINDOWS平臺(tái)下的IOCP模式和LINUX下的EPOLL模式使用事件驅(qū)動(dòng)的模式,當(dāng)某個(gè)SOCKET有網(wǎng)絡(luò)信息到達(dá)的時(shí)候會(huì)通過相應(yīng)的事件直接觸發(fā),不需要去輪詢,而且也沒有SOCKET最大的SOCKET個(gè)數(shù)為1024的限制。IOCP是一組WINDOWS平臺(tái)下的API的集合,EPOLL是一組LINUX平臺(tái)下的API集合,他們各自在自己的系統(tǒng)上完成TCP/IP的網(wǎng)絡(luò)功能。但是IOCP模式和EPOLL模式的應(yīng)用受到系統(tǒng)的嚴(yán)格限制,雖然都完成了 TCP網(wǎng)絡(luò)層的功能,但是必須針對(duì)WINDOWS平臺(tái)調(diào)用IOCP模式,LINUX平臺(tái)調(diào)用EPOLL模式。這樣為了能夠使用戶端每個(gè)使用網(wǎng)絡(luò)的程序能夠在WINDOWS平臺(tái)下和LINUX平臺(tái)下都能使用,其必須編寫兩份代碼,給用戶使用帶來不便。
【發(fā)明內(nèi)容】
[0005]為此,本發(fā)明所要解決的技術(shù)問題在于現(xiàn)有技術(shù)中網(wǎng)絡(luò)接口模式?jīng)]有進(jìn)行封裝,不能跨平臺(tái)應(yīng)用,用戶使用不方便,從而提出一種網(wǎng)絡(luò)接口模式和基于該網(wǎng)絡(luò)接口模式的數(shù)據(jù)通信方法。
[0006]為解決上述技術(shù)問題,本發(fā)明提供如下技術(shù)方案:
[0007]一種數(shù)據(jù)通信方法,用戶端采用網(wǎng)絡(luò)接口模式PR0ACT0R實(shí)現(xiàn)與TCP/IP網(wǎng)絡(luò)層的數(shù)據(jù)傳輸,其中:
[0008]當(dāng)數(shù)據(jù)從所述TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)內(nèi)核讀取到用戶端提供的緩沖區(qū)中,所述網(wǎng)絡(luò)接口模式PR0ACT0R通知用戶端接收數(shù)據(jù);
[0009]當(dāng)所述TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)的緩沖區(qū)具有足夠存儲(chǔ)空間時(shí),所述網(wǎng)絡(luò)接口模式PR0ACT0R通知用戶端可發(fā)送數(shù)據(jù)。
[0010]上述數(shù)據(jù)通信方法,當(dāng)用戶端在WINDOWS平臺(tái)下時(shí),數(shù)據(jù)收發(fā)過程如下:
[0011]所述用戶端讀取數(shù)據(jù)時(shí):
[0012]用戶端發(fā)送讀請(qǐng)求,將用戶端空間緩存?zhèn)鬟f給TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)內(nèi)核;
[0013]TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)內(nèi)核在有數(shù)據(jù)要傳輸時(shí),將待傳輸數(shù)據(jù)寫入到內(nèi)核中的用戶端空間緩存;
[0014]通過網(wǎng)絡(luò)接口模式PR0ACT0R通知用戶端接收數(shù)據(jù);
[0015]所述用戶端發(fā)送數(shù)據(jù)時(shí):
[0016]用戶端發(fā)送一個(gè)發(fā)送請(qǐng)求,請(qǐng)求一個(gè)或者多個(gè)空間緩存發(fā)送數(shù)據(jù);
[0017]如果TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)的緩沖區(qū)有足夠存儲(chǔ)空間,將全部待發(fā)送數(shù)據(jù)存儲(chǔ)至TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)的緩沖區(qū),所述網(wǎng)絡(luò)接口模式PR0ACT0R屏蔽成功發(fā)送數(shù)據(jù)的通知;
[0018]如果TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)的緩沖區(qū)的存儲(chǔ)空間不足,所述網(wǎng)絡(luò)接口模式PR0ACT0R通知用戶端不能發(fā)送數(shù)據(jù),在空間不足的狀態(tài)下,所述網(wǎng)絡(luò)接口模式PR0ACT0R接收到最后一次成功發(fā)送數(shù)據(jù)的通知時(shí),所述網(wǎng)絡(luò)接口模式PR0ACT0R通知用戶端可發(fā)送數(shù)據(jù)。
[0019]上述數(shù)據(jù)通信方法,當(dāng)用戶端在LINUX平臺(tái)下時(shí),數(shù)據(jù)收發(fā)過程如下:
[0020]所述用戶端讀取數(shù)據(jù)時(shí):
[0021]用戶端發(fā)送讀請(qǐng)求,將用戶端空間緩存?zhèn)魉徒o所述網(wǎng)絡(luò)接口模式PR0ACT0R ;
[0022]TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)內(nèi)核有數(shù)據(jù)要傳輸時(shí),將待傳輸數(shù)據(jù)寫入到所述網(wǎng)絡(luò)接口模式PR0ACT0R中的用戶端空間緩存;
[0023]再通過所述網(wǎng)絡(luò)接口模式PR0ACT0R通知用戶端接收數(shù)據(jù);
[0024]所述用戶端發(fā)送數(shù)據(jù)時(shí):
[0025]如果TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)的緩沖區(qū)有足夠存儲(chǔ)空間,將全部待發(fā)送數(shù)據(jù)存儲(chǔ)到TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)的緩沖區(qū);所述網(wǎng)絡(luò)接口模式PR0ACT0R通知用戶端可以發(fā)送數(shù)據(jù);
[0026]如果TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)的緩沖區(qū)的存儲(chǔ)空間不足,所述網(wǎng)絡(luò)接口模式PR0ACT0R通知用戶端不能發(fā)送消息,直到TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)的緩沖區(qū)有三分之一空閑時(shí),再通過所述網(wǎng)絡(luò)接口模式PR0ACT0R通知用戶端可發(fā)送數(shù)據(jù)。
[0027]上述數(shù)據(jù)通信方法,所述網(wǎng)絡(luò)接口模式PR0ACT0R包括SendData函數(shù),所述用戶端可通過所述SendData函數(shù)將全部待發(fā)送數(shù)據(jù)完整的發(fā)送至TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)內(nèi)核且不會(huì)有剩余數(shù)據(jù)。
[0028]一種網(wǎng)絡(luò)接口模式,其內(nèi)封裝有IOCP網(wǎng)絡(luò)接口模式、EPOLL網(wǎng)絡(luò)接口模式、IOCP的PR0ACT0R實(shí)現(xiàn)模式以及EPOLL的PR0ACT0R實(shí)現(xiàn)模式,其中:
[0029]所述IOCP網(wǎng)絡(luò)接口模式用于WINDOWS平臺(tái)下的用戶端實(shí)現(xiàn)讀取數(shù)據(jù);
[0030]所述IOCP的PR0ACT0R實(shí)現(xiàn)模式用于WINDOWS平臺(tái)下的用戶端實(shí)現(xiàn)發(fā)送數(shù)據(jù);
[0031]所述EPOLL的PR0ACT0R實(shí)現(xiàn)模式用于LINUX平臺(tái)下的用戶端實(shí)現(xiàn)讀取數(shù)據(jù);
[0032]所述EPOLL網(wǎng)絡(luò)接口模式用于LINUX平臺(tái)下的用戶端實(shí)現(xiàn)發(fā)送數(shù)據(jù)。
[0033]上述網(wǎng)絡(luò)接口模式,所述IOCP的PR0ACT0R實(shí)現(xiàn)模式是指:
[0034]TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)的緩沖區(qū)有足夠存儲(chǔ)空間時(shí):
[0035]屏蔽用戶端成功發(fā)送數(shù)據(jù)的通知;
[0036]TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)的緩沖區(qū)的存儲(chǔ)空間不足時(shí):
[0037]接收到的最后一次成功發(fā)送數(shù)據(jù)的通知轉(zhuǎn)換為用戶端可發(fā)送數(shù)據(jù)的通知。
[0038]上述網(wǎng)絡(luò)接口模式,所述EPOLL的PR0ACT0R實(shí)現(xiàn)模式是指將用戶端空間緩存?zhèn)魉徒o網(wǎng)絡(luò)接口模式PROACTOR ;TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)內(nèi)核在有數(shù)據(jù)要傳輸時(shí),將待傳輸數(shù)據(jù)寫入到網(wǎng)絡(luò)接口模式PROACTOR中的用戶端空間緩存;
[0039]上述網(wǎng)絡(luò)接口模式,用戶端在WINDOWS平臺(tái)下時(shí),若用戶端可以讀取或者發(fā)送數(shù)據(jù)時(shí),先由所述IOCP網(wǎng)絡(luò)接口模式通知所述網(wǎng)絡(luò)接口模式PR0ACT0R,然后由所述網(wǎng)絡(luò)接口模式PROACTOR通知用戶端可以讀取或者發(fā)送數(shù)據(jù)。
[0040]上述網(wǎng)絡(luò)接口模式,用戶端在LINUX平臺(tái)下時(shí),若用戶端可以讀取或者發(fā)送數(shù)據(jù)時(shí),先由所述EPOLL網(wǎng)絡(luò)接口模式通知所述網(wǎng)絡(luò)接口模式PR0ACT0R,然后由所述網(wǎng)絡(luò)接口模式PROACTOR通知用戶端可以讀取或者發(fā)送數(shù)據(jù)。
[0041]上述網(wǎng)絡(luò)接口模式,還包括SendData函數(shù),所述用戶端可通過所述SendData函數(shù)將全部待發(fā)送數(shù)據(jù)完整的發(fā)送至TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)而不會(huì)有剩余數(shù)據(jù)。
[0042]本發(fā)明的上述技術(shù)方案相比現(xiàn)有技術(shù)具有以下優(yōu)點(diǎn):
[0043](I)本發(fā)明所述的網(wǎng)絡(luò)接口模式和基于該網(wǎng)絡(luò)接口模式的數(shù)據(jù)通信方法,采用一個(gè)統(tǒng)一的網(wǎng)絡(luò)接口模式PR0ACT0R,實(shí)現(xiàn)用戶端與TCP/IP網(wǎng)絡(luò)層之間的數(shù)據(jù)傳輸,用戶利用網(wǎng)絡(luò)接口模式PR0ACT0R編寫網(wǎng)絡(luò)程序,只需一份代碼,用戶端每個(gè)使用網(wǎng)絡(luò)的程序就可以在WINDOWS平臺(tái)下和LINUX平臺(tái)下都能使用。
[0044](2)本發(fā)明所述的網(wǎng)絡(luò)接口模式和基于該網(wǎng)絡(luò)接口模式的數(shù)據(jù)通信方法,在WINDOWS平臺(tái)下,讀取數(shù)據(jù)時(shí)采用IOCP的讀取機(jī)制,發(fā)送數(shù)據(jù)時(shí),分為兩種情況,TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)的緩沖區(qū)有足夠存儲(chǔ)空間時(shí),網(wǎng)絡(luò)接口模式PROACTOR屏蔽成功發(fā)送數(shù)據(jù)的通知,如果TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)的緩沖區(qū)的存儲(chǔ)空間不足,網(wǎng)絡(luò)接口模式PROACTOR接收到最后一次成功發(fā)送數(shù)據(jù)的通知時(shí),所述網(wǎng)絡(luò)接口模式PR0ACT0R通知用戶端可發(fā)送數(shù)據(jù),這樣就完成了 IOCP的PROACTOR實(shí)現(xiàn),網(wǎng)絡(luò)接口模式PROACTOR就可以在WINDOWS平臺(tái)下使用。
[0045](3)本發(fā)明所述的網(wǎng)絡(luò)接口模式和基于該網(wǎng)絡(luò)接口模式的數(shù)據(jù)通信方法,在LINUX平臺(tái)下,發(fā)送數(shù)據(jù)時(shí),采用EPOLL的發(fā)送機(jī)制,讀取數(shù)據(jù)時(shí),通過網(wǎng)絡(luò)接口模式PROACTOR讀取數(shù)據(jù)到用戶提供的緩存中,這樣就完成了 EPOLL的PROACTOR實(shí)現(xiàn),網(wǎng)絡(luò)接口模式PROACTOR就可以在LINUX平臺(tái)下使用。
[0046](4)本發(fā)明所述的網(wǎng)絡(luò)接口模式和基于該網(wǎng)絡(luò)接口模式的數(shù)據(jù)通信方法,網(wǎng)絡(luò)接口模式PROACTOR中的SendData函數(shù),所述用戶端可通過所述SendData函數(shù)將全部待發(fā)送數(shù)據(jù)完整的發(fā)送至TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)內(nèi)核且不會(huì)有剩余數(shù)據(jù),保證了數(shù)據(jù)的完整發(fā)送,給上層的應(yīng)用提供了很大的便利。
【專利附圖】
【附圖說明】
[0047]為了使本發(fā)明的內(nèi)容更容易被清楚的理解,下面根據(jù)本發(fā)明的具體實(shí)施例并結(jié)合附圖,對(duì)本發(fā)明作進(jìn)一步詳細(xì)的說明,其中
[0048]圖1是本發(fā)明一個(gè)實(shí)施例的一種數(shù)據(jù)通信方法的流程圖;
[0049]圖2是本發(fā)明一個(gè)實(shí)施例的一種網(wǎng)絡(luò)接口模式的原理框圖。
【具體實(shí)施方式】
[0050]實(shí)施例1[0051]本實(shí)施例提供一種數(shù)據(jù)通信方法,如圖1所示:用戶端采用網(wǎng)絡(luò)接口模式PROACTOR實(shí)現(xiàn)與TCP/IP網(wǎng)絡(luò)層的數(shù)據(jù)傳輸,其中:當(dāng)數(shù)據(jù)從所述TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)內(nèi)核讀取到用戶端提供的緩沖區(qū)中,所述網(wǎng)絡(luò)接口模式PROACTOR通知用戶端接收數(shù)據(jù);當(dāng)所述TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)的緩沖區(qū)具有足夠存儲(chǔ)空間時(shí),所述網(wǎng)絡(luò)接口模式PROACTOR通知用戶端可發(fā)送數(shù)據(jù)。
[0052]網(wǎng)絡(luò)接口模式PROACTOR是一種異步完成通知的模式,PR0AC0TR模式來自《Pattern-Oriented Software Architecture》系列叢書,POSA 是 Pattern-OrientedSoftware Architecture (面向模式的軟件架構(gòu))的縮寫,即軟件架構(gòu)的所有實(shí)現(xiàn)都是出自某個(gè)已有或者創(chuàng)造的模式,可以是單個(gè)模式,也可以多個(gè)模式的組合,現(xiàn)在復(fù)雜的軟件框架基本上都是多個(gè)模式的組合。
[0053]當(dāng)用戶端在WINDOWS平臺(tái)下時(shí),數(shù)據(jù)收發(fā)過程如下:
[0054]所述用戶端讀取數(shù)據(jù)時(shí):
[0055]用戶端發(fā)送讀請(qǐng)求,將用戶端空間緩存?zhèn)鬟f給TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)內(nèi)核;
[0056]TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)內(nèi)核在有數(shù)據(jù)要傳輸時(shí),將待傳輸數(shù)據(jù)寫入到內(nèi)核中的用戶端空間緩存;
[0057]通過網(wǎng)絡(luò)接口模式PROACTOR通知用戶端接收數(shù)據(jù);
[0058]這樣在系統(tǒng)內(nèi)核就少了一次數(shù)據(jù)的拷貝,但是當(dāng)用戶端傳遞的空間緩存用完之后,系統(tǒng)還是會(huì)使用內(nèi)核的網(wǎng)絡(luò)緩沖區(qū)緩存數(shù)據(jù)信息,
[0059]所述用戶端發(fā)送數(shù)據(jù)時(shí):
[0060]用戶端發(fā)送一個(gè)發(fā)送請(qǐng)求,請(qǐng)求一個(gè)或者多個(gè)空間緩存發(fā)送數(shù)據(jù);
[0061]如果TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)的緩沖區(qū)有足夠存儲(chǔ)空間,系統(tǒng)將全部待發(fā)送數(shù)據(jù)存儲(chǔ)至TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)的緩沖區(qū),然后不鎖定該緩沖區(qū),由上層程序自己處理,這時(shí)會(huì)有一個(gè)消息通知用戶端成功發(fā)送數(shù)據(jù),所述網(wǎng)絡(luò)接口模式PROACTOR屏蔽成功發(fā)送數(shù)據(jù)的通知,TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)的緩沖區(qū)在網(wǎng)絡(luò)合適的時(shí)候,將待發(fā)送數(shù)據(jù)拷貝到網(wǎng)卡緩沖區(qū),進(jìn)行真正的發(fā)送;
[0062]如果TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)的緩沖區(qū)的存儲(chǔ)空間不足,用戶端請(qǐng)求空間緩存去發(fā)送時(shí)會(huì)返回PENDING(阻塞)的通知,表示此時(shí)TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)的緩沖區(qū)已滿,暫時(shí)沒有剩余的緩存用來存儲(chǔ)用戶端空間緩存中的數(shù)據(jù)信息,這時(shí)系統(tǒng)會(huì)鎖定用戶端的空間緩存,用戶端的空間緩存會(huì)被鎖定到系統(tǒng)的非分頁內(nèi)存中,所述網(wǎng)絡(luò)接口模式PROACTOR通知用戶端不能發(fā)送數(shù)據(jù),所述網(wǎng)絡(luò)接口模式PROACTOR接收到最后一次成功發(fā)送數(shù)據(jù)的通知時(shí),所述網(wǎng)絡(luò)接口模式PROACTOR通知用戶端可發(fā)送數(shù)據(jù)。
[0063]用戶端每發(fā)送一個(gè)發(fā)送請(qǐng)求計(jì)數(shù)器就會(huì)加1,每收到成功發(fā)送數(shù)據(jù)的通知計(jì)數(shù)器就會(huì)減1,如果TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)的緩沖區(qū)有足夠存儲(chǔ)空間,用戶端可以一直發(fā)送,網(wǎng)絡(luò)接口模式PROACTOR屏蔽掉每次成功發(fā)送數(shù)據(jù)的通知;如果TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)的緩沖區(qū)存儲(chǔ)空間不足,則用戶端請(qǐng)求空間緩存去發(fā)送時(shí)會(huì)返回PENDING(阻塞)的通知,這時(shí)系統(tǒng)會(huì)鎖定用戶端的空間緩存,用戶端的空間緩存會(huì)被鎖定到系統(tǒng)的非分頁內(nèi)存中,所述網(wǎng)絡(luò)接口模式PR0ACT0R通知用戶端不能發(fā)送數(shù)據(jù),在PENDING狀態(tài)下,TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)的緩沖區(qū)有足夠空間時(shí),TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)的緩沖區(qū)拷貝鎖定的用戶端空間緩存中的數(shù)據(jù),當(dāng)收到最后一次成功發(fā)送數(shù)據(jù)的通知時(shí),計(jì)數(shù)器顯示為0,這時(shí)所述網(wǎng)絡(luò)接口模式PROACTOR將最后一次成功發(fā)送數(shù)據(jù)的通知轉(zhuǎn)換為通知用戶端可發(fā)送數(shù)據(jù)的通知。
[0064]當(dāng)用戶端在LINUX平臺(tái)下時(shí),數(shù)據(jù)收發(fā)過程如下:
[0065]所述用戶端讀取數(shù)據(jù)時(shí):
[0066]用戶端發(fā)送讀請(qǐng)求,提前將用戶端空間緩存?zhèn)魉徒o所述網(wǎng)絡(luò)接口模式PROACTOR ;
[0067]TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)內(nèi)核有數(shù)據(jù)要傳輸時(shí),將待傳輸數(shù)據(jù)寫入到所述網(wǎng)絡(luò)接口模式PROACTOR中的用戶端空間緩存;
[0068]再通過所述網(wǎng)絡(luò)接口模式PROACTOR通知用戶端接收數(shù)據(jù);
[0069]所述用戶端發(fā)送數(shù)據(jù)時(shí):
[0070]如果TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)的緩沖區(qū)有足夠存儲(chǔ)空間,將全部待發(fā)送數(shù)據(jù)存儲(chǔ)到TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)的緩沖區(qū);所述網(wǎng)絡(luò)接口模式PROACTOR通知用戶端可以發(fā)送數(shù)據(jù);
[0071]如果TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)的緩沖區(qū)的存儲(chǔ)空間不足,所述網(wǎng)絡(luò)接口模式PROACTOR通知用戶端不能繼續(xù)發(fā)送消息,直到TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)的緩沖區(qū)有三分之一空閑時(shí),再通過所述網(wǎng)絡(luò)接口模式PROACTOR通知用戶端可發(fā)送數(shù)據(jù)。
[0072]網(wǎng)絡(luò)接口模式PROACTOR對(duì)于WINDOWS平臺(tái)和LINUX平臺(tái)的公共接口,
[0073]IPosaNetHandler
[0074]-1nt m_hSocket
[0075]_CPosaNetRequest*m_pSendReq
[0076]+HandleAccept ()
[0077]+HandleConnect ()
[0078]+HandleClose ()
[0079]+HandleRead ()
[0080]+HandleSend ()
[0081]+SendData ()
[0082]其中:IPosaNetHandler是需要用戶端實(shí)現(xiàn)的類;HandleAccept通知用戶端有新的連接到來,參數(shù)為SOCKET的fd,用于SERVER的通知;HandleConnect通知用戶發(fā)起的連接成功,用于客戶端發(fā)起請(qǐng)求;HandleClose用于斷鏈通知;HandleRead通知用戶端有新的數(shù)據(jù)到來,數(shù)據(jù)在CPosaBuffer參數(shù)內(nèi);HandleSend通知用戶現(xiàn)在可以發(fā)送數(shù)據(jù)了 ;SendData發(fā)送數(shù)據(jù)。
[0083]在WINDOWS平臺(tái)下,調(diào)用SendData時(shí),即發(fā)送數(shù)據(jù)時(shí),如果TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)的緩沖區(qū)有足夠空間,會(huì)把待發(fā)送數(shù)據(jù)完整拷貝,如果空間不足,系統(tǒng)將鎖定用戶端空間緩存,請(qǐng)求發(fā)送的緩沖區(qū)將會(huì)被鎖定到系統(tǒng)的非分頁內(nèi)存中,這個(gè)時(shí)候該數(shù)據(jù)區(qū)域不能被重寫,直到TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)的緩存去有空余的地方來接受拷貝用戶端空間緩存中的數(shù)據(jù)才拷貝走,每次發(fā)送,不會(huì)產(chǎn)生只發(fā)送一部分?jǐn)?shù)據(jù)的情況,每次都是數(shù)據(jù)被全部發(fā)送成功。
[0084]在LINUX平臺(tái)下,調(diào)用SendData時(shí),即發(fā)送數(shù)據(jù)時(shí),每次發(fā)送只會(huì)發(fā)送TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)的緩沖區(qū)能容納的部分,在TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)的緩沖區(qū)空間不足時(shí),會(huì)產(chǎn)生只發(fā)送部分?jǐn)?shù)據(jù)的情況,網(wǎng)絡(luò)接口模式PROACTOR將剩余部分的數(shù)據(jù)拷貝到網(wǎng)絡(luò)接口模式PROACTOR的緩沖區(qū)中,然后監(jiān)控可以可發(fā)送通知,收到可發(fā)送通知后,首先將上次剩余部分的數(shù)據(jù)發(fā)送完成,直到?jīng)]有剩余部分的數(shù)據(jù)要發(fā)送了,PROACTOR通知用戶端可發(fā)送數(shù)據(jù)。
[0085]這樣,無論用戶端在哪個(gè)平臺(tái)下應(yīng)用,用戶端調(diào)用SendData發(fā)送數(shù)據(jù)的語義都是只要調(diào)用這個(gè)函數(shù),就一定能保證數(shù)據(jù)被完整地發(fā)送,不需要用戶端在上層緩沖區(qū)中緩存剩余部分的信息,這個(gè)行為對(duì)用戶來說是非常方便的,尤其能保證數(shù)據(jù)的完整性。
[0086]實(shí)施例2
[0087]本實(shí)施例提供一種網(wǎng)絡(luò)接口模式,如圖2所示,其內(nèi)封裝有IOCP網(wǎng)絡(luò)接口模式、EPOLL網(wǎng)絡(luò)接口模式、IOCP的PROACTOR實(shí)現(xiàn)模式以及EPOLL的PROACTOR實(shí)現(xiàn)模式,其中:
[0088]所述IOCP網(wǎng)絡(luò)接口模式用于WINDOWS平臺(tái)的用戶端實(shí)現(xiàn)讀取數(shù)據(jù);
[0089]所述IOCP的PROACTOR實(shí)現(xiàn)模式用于WINDOWS平臺(tái)的用戶端實(shí)現(xiàn)發(fā)送數(shù)據(jù);
[0090]所述EPOLL的PROACTOR實(shí)現(xiàn)模式用于LINUX平臺(tái)的用戶端實(shí)現(xiàn)讀取數(shù)據(jù);
[0091]所述EPOLL網(wǎng)絡(luò)接口模式用于LINUX平臺(tái)的用戶端實(shí)現(xiàn)發(fā)送數(shù)據(jù)。
[0092]所述IOCP的PROACTOR實(shí)現(xiàn)模式是指:
[0093]TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)的緩沖區(qū)有足夠存儲(chǔ)空間時(shí):
[0094]屏蔽用戶端成功發(fā)送數(shù)據(jù)的通知;
[0095]TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)的緩沖區(qū)的存儲(chǔ)空間不足時(shí):
[0096]接收到的最后一次成功發(fā)送數(shù)據(jù)的通知轉(zhuǎn)換為用戶端可發(fā)送數(shù)據(jù)的通知。
[0097]所述EPOLL的PROACTOR實(shí)現(xiàn)模式是指將用戶端空間緩存?zhèn)魉徒o網(wǎng)絡(luò)接口模式PROACTOR ;TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)內(nèi)核在有數(shù)據(jù)要傳輸時(shí),將待傳輸數(shù)據(jù)寫入到網(wǎng)絡(luò)接口模式PROACTOR中的用戶端空間緩存;
[0098]用戶端在WINDOWS平臺(tái)下時(shí),若用戶端可以讀取或者發(fā)送數(shù)據(jù)時(shí),先由所述IOCP網(wǎng)絡(luò)接口模式通知所述網(wǎng)絡(luò)接口模式PR0ACT0R,然后由所述網(wǎng)絡(luò)接口模式PROACTOR通知用戶端可以讀取或者發(fā)送數(shù)據(jù)。
[0099]用戶端在LINUX平臺(tái)下時(shí),若用戶端可以讀取或者發(fā)送數(shù)據(jù)時(shí),先由所述EPOLL網(wǎng)絡(luò)接口模式通知所述網(wǎng)絡(luò)接口模式PR0ACT0R,然后由所述網(wǎng)絡(luò)接口模式PROACTOR通知用戶端可以讀取或者發(fā)送數(shù)據(jù)。
[0100]所述的網(wǎng)絡(luò)接口模式,還包括SendData函數(shù),具體如實(shí)施例1中所述,所述用戶端可通過所述SendData函數(shù)將全部待發(fā)送數(shù)據(jù)完整的發(fā)送至TCP/IP所在系統(tǒng)而不會(huì)有剩余數(shù)據(jù)。
[0101]使用網(wǎng)絡(luò)接口模式PROACTOR時(shí),整個(gè)網(wǎng)絡(luò)服務(wù)的創(chuàng)建過程如下:
[0102]S1:創(chuàng)建一個(gè)CPosaNetProactor,會(huì)創(chuàng)建一支線程和內(nèi)核網(wǎng)絡(luò)對(duì)象,然后繼承實(shí)現(xiàn)一個(gè) IPosaNetHandler 的子類;
[0103]CPosaNetProactor (獨(dú)立線程)
[0104]-HANDLE m_h10CP
[0105]-HANDLE*m_pThreadHandle
[0106]+Open ()
[0107]+CloseO
[0108]+RegisterHandler (SOCKET s)()
[0109]S2 JPosaNetHandler 會(huì)創(chuàng)建一個(gè) SOCKET,并將該 SOCKET 綁定到某個(gè) CPosaNetPROACTOR 上去,IPosaNetHandler 可以將 SOCKET 綁定到任何一個(gè)CPosaNetPROACTOR上去,但是在其生命周期內(nèi)只允許綁定到固定一個(gè)上去,不能任意切換;
[0110]S3:PosaNetHandler 通過 CPosaNetRequest,發(fā)起發(fā)送或者接收的請(qǐng)求,CPosaNetRequest將自己的指針綁定事件傳遞給內(nèi)核IOCP或者EP0LL,當(dāng)內(nèi)核有相應(yīng)的事件發(fā)生時(shí),會(huì)將事件類型和預(yù)先傳遞進(jìn)去的指針返回回來;
[0111]CPosaNetRequest
[0112]-1PosaNetHandler*m_pPosaHandler
[0113]+AcceptEx ()
[0114]+ConnectEx O
[0115]+RecvO
[0116]+Send ()
[0117]+HandleIOCPEvent ()
[0118]S4:調(diào)用 CPosaNetRequest 的 HandleIOCPEvent 函數(shù)或者 HandleEPOLLEvent 將IOCP或EPOLL的事件進(jìn)行分發(fā),根據(jù)網(wǎng)絡(luò)語義和保存的IPosaNetHandler指針去調(diào)用不同的虛函數(shù),最終達(dá)到消息的通知。LINUX平臺(tái)和WINDOWS平臺(tái)的內(nèi)部實(shí)現(xiàn)根據(jù)其邏輯的不同,做了不同的處理,以達(dá)到相同的網(wǎng)絡(luò)語義。
[0119]每個(gè)PROACTOR都是一支獨(dú)立的線程用戶可以動(dòng)態(tài)地根據(jù)CPU的核數(shù)去創(chuàng)建PROACTOR的個(gè)數(shù),再做一個(gè)簡單的平均負(fù)載均衡,這樣當(dāng)CPU個(gè)數(shù)增加的時(shí)候,可以充分地利用CPU的性能,不需要用戶端修改任何的程序代碼。
[0120]根據(jù)不同的業(yè)務(wù)邏輯去綁定不同的Handler到不同的PROACTOR上。例如:可以將所有的監(jiān)聽的SOCKET都綁定到一支獨(dú)立的監(jiān)聽PROACTOR上,每個(gè)不同的監(jiān)聽端口上來的連接,綁定到對(duì)應(yīng)的獨(dú)立PROACTOR上,這樣充分利用CPU性能,而且監(jiān)聽事件可以快速處理。
[0121]顯然,上述實(shí)施例僅僅是為清楚地說明所作的舉例,而并非對(duì)實(shí)施方式的限定。對(duì)于所屬領(lǐng)域的普通技術(shù)人員來說,在上述說明的基礎(chǔ)上還可以做出其它不同形式的變化或變動(dòng)。這里無需也無法對(duì)所有的實(shí)施方式予以窮舉。而由此所引伸出的顯而易見的變化或變動(dòng)仍處于本發(fā)明創(chuàng)造的保護(hù)范圍之中。
【權(quán)利要求】
1.一種數(shù)據(jù)通信方法,其特征在于:用戶端采用網(wǎng)絡(luò)接口模式PROACTOR實(shí)現(xiàn)與TCP/IP網(wǎng)絡(luò)層的數(shù)據(jù)傳輸,其中: 當(dāng)數(shù)據(jù)從所述TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)內(nèi)核讀取到用戶端提供的緩沖區(qū)中,所述網(wǎng)絡(luò)接口模式PROACTOR通知用戶端接收數(shù)據(jù); 當(dāng)所述TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)的緩沖區(qū)具有足夠存儲(chǔ)空間時(shí),所述網(wǎng)絡(luò)接口模式PROACTOR通知用戶端可發(fā)送數(shù)據(jù)。
2.根據(jù)權(quán)利要求1所述的數(shù)據(jù)通信方法,其特征在于,當(dāng)用戶端在WINDOWS平臺(tái)下時(shí),數(shù)據(jù)收發(fā)過程如下: 所述用戶端讀取數(shù)據(jù)時(shí): 用戶端發(fā)送讀請(qǐng)求,將用戶端空間緩存?zhèn)鬟f給TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)內(nèi)核; TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)內(nèi)核在有數(shù)據(jù)要傳輸時(shí),將待傳輸數(shù)據(jù)寫入到內(nèi)核中的用戶端空間緩存; 通過網(wǎng)絡(luò)接口模式PROACTOR通知用戶端接收數(shù)據(jù); 所述用戶端發(fā)送數(shù)據(jù)時(shí): 用戶端發(fā)送一個(gè)發(fā)送請(qǐng)求,請(qǐng)求一個(gè)或者多個(gè)空間緩存發(fā)送數(shù)據(jù);如果TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)的緩沖區(qū)有足夠存儲(chǔ)空間,將全部待發(fā)送數(shù)據(jù)存儲(chǔ)至TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)的緩沖區(qū),所述網(wǎng)絡(luò)接口模式PROACTOR屏蔽成功發(fā)送數(shù)據(jù)的通知;如果TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)的緩沖區(qū)的存儲(chǔ)空間不足,所述網(wǎng)絡(luò)接口模式PROACTOR通知用戶端不能發(fā)送數(shù)據(jù),在空間不足的狀態(tài)下,所述網(wǎng)絡(luò)接口模式PROACTOR接收到最后一次成功發(fā)送數(shù)據(jù)的通知時(shí),所述網(wǎng)絡(luò)接口模式PROACTOR通知用戶端可發(fā)送數(shù)據(jù)。
3.根據(jù)權(quán)利要求1或2所述的數(shù)據(jù)通信方法,其特征在于,當(dāng)用戶端在LINUX平臺(tái)下時(shí),數(shù)據(jù)收發(fā)過程如下: 所述用戶端讀取數(shù)據(jù)時(shí): 用戶端發(fā)送讀請(qǐng)求,將用戶端空間緩存?zhèn)魉徒o所述網(wǎng)絡(luò)接口模式PROACTOR ; TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)內(nèi)核有數(shù)據(jù)要傳輸時(shí),將待傳輸數(shù)據(jù)寫入到所述網(wǎng)絡(luò)接口模式PROACTOR中的用戶端空間緩存; 再通過所述網(wǎng)絡(luò)接口模式PROACTOR通知用戶端接收數(shù)據(jù); 所述用戶端發(fā)送數(shù)據(jù)時(shí): 如果TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)的緩沖區(qū)有足夠存儲(chǔ)空間,將全部待發(fā)送數(shù)據(jù)存儲(chǔ)到TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)的緩沖區(qū);所述網(wǎng)絡(luò)接口模式PROACTOR通知用戶端可以發(fā)送數(shù)據(jù); 如果TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)的緩沖區(qū)的存儲(chǔ)空間不足,所述網(wǎng)絡(luò)接口模式PROACTOR通知用戶端不能發(fā)送消息,直到TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)的緩沖區(qū)有三分之一空閑時(shí),再通過所述網(wǎng)絡(luò)接口模式PROACTOR通知用戶端可發(fā)送數(shù)據(jù)。
4.根據(jù)權(quán)利要求1-3任一所述的數(shù)據(jù)通信方法,其特征在于,所述網(wǎng)絡(luò)接口模式PROACTOR包括SendData函數(shù),所述用戶端可通過所述SendData函數(shù)將全部待發(fā)送數(shù)據(jù)完整的發(fā)送至TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)內(nèi)核且不會(huì)有剩余數(shù)據(jù)。
5.—種網(wǎng)絡(luò)接口模式,其特征在于,其內(nèi)封裝有IOCP網(wǎng)絡(luò)接口模式、EPOLL網(wǎng)絡(luò)接口模式、IOCP的PROACTOR實(shí)現(xiàn)模式以及EPOLL的PROACTOR實(shí)現(xiàn)模式,其中:所述IOCP網(wǎng)絡(luò)接口模式用于WINDOWS平臺(tái)下的用戶端實(shí)現(xiàn)讀取數(shù)據(jù); 所述IOCP的PROACTOR實(shí)現(xiàn)模式用于WINDOWS平臺(tái)下的用戶端實(shí)現(xiàn)發(fā)送數(shù)據(jù); 所述EPOLL的PROACTOR實(shí)現(xiàn)模式用于LINUX平臺(tái)下的用戶端實(shí)現(xiàn)讀取數(shù)據(jù); 所述EPOLL網(wǎng)絡(luò)接口模式用于LINUX平臺(tái)下的用戶端實(shí)現(xiàn)發(fā)送數(shù)據(jù)。
6.根據(jù)權(quán)利要求5所述的網(wǎng)絡(luò)接口模式,其特征在于,所述IOCP的PROACTOR實(shí)現(xiàn)模式是指: TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)的緩沖區(qū)有足夠存儲(chǔ)空間時(shí): 屏蔽用戶端成功發(fā)送數(shù)據(jù)的通知; TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)的緩沖區(qū)的存儲(chǔ)空間不足時(shí): 接收到的最后一次成功發(fā)送數(shù)據(jù)的通知轉(zhuǎn)換為用戶端可發(fā)送數(shù)據(jù)的通知。
7.根據(jù)權(quán)利要求5或6所述的網(wǎng)絡(luò)接口模式,其特征在于: 所述EPOLL的PROACTOR實(shí)現(xiàn)模式是指將用戶端空間緩存?zhèn)魉徒o網(wǎng)絡(luò)接口模式PROACTOR ;TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)內(nèi)核在有數(shù)據(jù)要傳輸時(shí),將待傳輸數(shù)據(jù)寫入到網(wǎng)絡(luò)接口模式PROACTOR中的用戶端空間緩存。
8.根據(jù)權(quán)利要求5-7任一所述的網(wǎng)絡(luò)接口模式,其特征在于,用戶端在WINDOWS平臺(tái)下時(shí),若用戶端可以讀取或者發(fā)送數(shù)據(jù)時(shí),先由所述IOCP網(wǎng)絡(luò)接口模式通知所述網(wǎng)絡(luò)接口模式PR0ACT0R,然后由所述網(wǎng)絡(luò)接口模式PROACTOR通知用戶端可以讀取或者發(fā)送數(shù)據(jù)。
9.根據(jù)權(quán)利要求5-8任一所述的網(wǎng)絡(luò)接口模式,其特征在于,用戶端在LINUX平臺(tái)下時(shí),若用戶端可以讀取或者發(fā)送數(shù)據(jù)時(shí),先由所述EPOLL網(wǎng)絡(luò)接口模式通知所述網(wǎng)絡(luò)接口模式PR0ACT0R,然后由所述網(wǎng)絡(luò)接口模式PROACTOR通知用戶端可以讀取或者發(fā)送數(shù)據(jù)。
10.根據(jù)權(quán)利要求5-9任一所述的網(wǎng)絡(luò)接口模式,其特征在于,還包括SendData函數(shù),所述用戶端可通過所述SendData函數(shù)將全部待發(fā)送數(shù)據(jù)完整的發(fā)送至TCP/IP網(wǎng)絡(luò)層所在系統(tǒng)而不會(huì)有剩余數(shù)據(jù)。
【文檔編號(hào)】H04L29/06GK103986733SQ201410245778
【公開日】2014年8月13日 申請(qǐng)日期:2014年6月4日 優(yōu)先權(quán)日:2014年6月4日
【發(fā)明者】王曉輝, 賴齊, 陳衛(wèi)東 申請(qǐng)人:蘇州科達(dá)科技股份有限公司