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