資源簡(jiǎn)介
說明
一、受限制庫(kù)Dll和lib說明:
庫(kù)文件G-TcpServer.lib、G-TcpServer.Dll是受限制的試用版本和Demo配套。
1、最大連接不能超過50
2、發(fā)送字節(jié)數(shù)不能超過50
3、不能設(shè)置0讀投遞、無超時(shí)機(jī)制
4、其他功能限制
二、版本解讀說明
1、版本名帶T的表示是受限制的試用版
2、版本名帶bata表示非正式版
3、版本名帶WChar表示支持WideChar
4、版本號(hào)以時(shí)間格式累加計(jì)數(shù)(60進(jìn)1)和顯示
三、文件“G-TcpServer無限制體驗(yàn)版.exe”是無限制的體驗(yàn)版。
四、文件夾
1、Demos文件夾是VC Lib、Dll庫(kù)及Delphi2010的例程源碼,供開發(fā)學(xué)習(xí)
2、G-Sockets文件夾是Lib和Dll庫(kù)的Delphi和VC的頭文件
3、Release\G-Sockets\Dll文件夾是動(dòng)態(tài)庫(kù)的輸出文件夾
4、Release\G-Sockets\Lib文件夾是靜態(tài)庫(kù)的輸出文件夾
1、模塊包含處理線程、工作線程和看守線程。
工作線程負(fù)責(zé)IO投遞工作,并響應(yīng)投遞返回,再把接收的數(shù)據(jù)投遞給處理線程,處理線程調(diào)用回調(diào)函數(shù)給應(yīng)用層,以此可以在通訊層和應(yīng)用層之間現(xiàn)實(shí)0拷貝數(shù)據(jù)的功能。模塊只有一個(gè)
看守線程,負(fù)責(zé):a、響應(yīng)Accept事件并投遞接受隊(duì)列;b、效驗(yàn)接受超時(shí)(即只連接不發(fā)數(shù)據(jù))斷開連接,防止空連接;c、效驗(yàn)空閑超時(shí)(即心跳超時(shí))斷開連接。
按工作量來分,最繁重的是處理線程,其次是工作線程,最閑的是看守線程。可通過OnThread事件回調(diào)函數(shù)設(shè)置線程權(quán)限。在此線程模式下,應(yīng)用層可以在回調(diào)函數(shù)里處理數(shù)據(jù)而不必再建立另外的數(shù)據(jù)處理線程池。
2、線程平衡
為使連接能平衡使用處理線程,每個(gè)連接同時(shí)只有一個(gè)處理線程處理工作線程投遞過來的IO返回事件并調(diào)用回調(diào)函數(shù)通知應(yīng)用層。
3、收發(fā)平衡
為使連接能平衡使用IO設(shè)備,每個(gè)連接同時(shí)只能投遞一個(gè)讀請(qǐng)求,并通過線程平衡機(jī)制保證接收的數(shù)據(jù)是按順序的被處理線程處理及通過回調(diào)函數(shù)傳遞給應(yīng)用層;同時(shí)也只能投遞一個(gè)寫請(qǐng)求,其余寫請(qǐng)求都按順序放在寫隊(duì)列里面。讀寫同步都使用臨界段。
4、0拷貝技術(shù)
接收數(shù)據(jù)0拷貝看1項(xiàng);提供GTcpSvr_AllocGBuf()、GTcpSvr_FreeGBuf()和GTcpSvr_PostSendGBuf()三個(gè)函數(shù)實(shí)現(xiàn)發(fā)送數(shù)據(jù)的0拷貝。
5、0讀投遞
為避免內(nèi)核鎖定分頁(yè)內(nèi)存過多,可通過設(shè)置來采用0讀投遞來降低吞吐性能從而實(shí)現(xiàn)大連接量。
6、HndData回收
HndData回收有多種方法,但額外會(huì)在收發(fā)數(shù)據(jù)這兩個(gè)頻率操作上增加工作量,因此盡量避免在這兩個(gè)操作時(shí)做太多的工作是有必要的。模塊均不采用“投遞計(jì)數(shù)”或“投遞鏈表”的方式來判斷回收HndData的時(shí)機(jī),而是一旦斷線立即回收,其他未決投遞繼續(xù)返回時(shí)只處理IoData,不對(duì)HndData做任何寫操作。同時(shí)為避免HndData剛收回來但其未決投遞還沒有完全返回之前就立即被利用的可能性,HndData池采用了FIFO雙鎖并發(fā)鏈表,該鏈表通過ExNumber值來實(shí)現(xiàn)在最大連接情況下HndData池還有ExNumber個(gè)數(shù)量使鏈表不為NULL,通過設(shè)置ExNumber數(shù)量可實(shí)現(xiàn)控制鏈表末端的HndData出列時(shí)間,在這個(gè)時(shí)間內(nèi)可以保證斷開剛回收的HndData的未決投遞能夠完全返回。
HndData池,初始時(shí)如下:
HD1 + HD2 + HD... + HDMaxConnection + HDEx1 + HDEx2 + HDEx... + HDExNumber
| |
Head------------------------------------------------------------------Tail
達(dá)到最大連接時(shí)如下:
HDEx1 + HDEx2 + HDEx... + HDExNumber
| |
Head---------------------------Tail
斷開回收一個(gè)HndData(HD)后如下:
HDEx1 + HDEx2 + HDEx... + HDExNumber + HD
| |
Head-------(需要T時(shí)間HD才能出列)------Tail
注:T可以通過控制ExNumber值來實(shí)現(xiàn),假定每秒最大可以處理C個(gè)連接和斷開,需要延時(shí)T秒所有未決投遞才會(huì)完全回收,那么:ExNumber = T * (MaxConnection / C)。實(shí)際上每個(gè)連接未決投遞非常少(因?yàn)樽x寫是單投遞的),并且工作線程并不處理數(shù)據(jù)工作量不大,因此T很短,模塊默認(rèn)是3秒。對(duì)于服務(wù)器而已,一秒能接受的連接量是可知預(yù)計(jì)的,模塊默認(rèn)是1萬,假定MaxConnection=C所以ExNumber是3萬。但實(shí)際應(yīng)用中,正常情況下連接率遠(yuǎn)少于1萬/S,尤其是長(zhǎng)連接的服務(wù)器,即使是短連接的服務(wù)器也不會(huì)發(fā)生這樣的連接率。可能的情況是DOS,如果是影響也不大,因?yàn)檫€有MaxConnection控制,超過這個(gè)數(shù)的連接就立即被CloseSocket了。和頻率高的數(shù)據(jù)收發(fā)相比,斷線、連接的頻率遠(yuǎn)少于它,在頻率低的地方上多做多點(diǎn)工作總比在頻率高的地方多做一點(diǎn)工作的好。
7、可伸縮性
IoData數(shù)量可根據(jù)初始需要設(shè)置,資源不足時(shí)模塊自動(dòng)向系統(tǒng)申請(qǐng)內(nèi)存。為保證HndData的安全性,HndData池還設(shè)置了延時(shí)出列,剛回收的HndData入列時(shí)間必須超過3(或更長(zhǎng))秒鐘,如果未達(dá)到3秒的,模塊自動(dòng)向系統(tǒng)申請(qǐng)內(nèi)存。
8、內(nèi)存管理
IoData和HndData均采用VirtualAlloc和VirtualFree來向系統(tǒng)操作內(nèi)存。IoData池采用原子函數(shù)InterlockedCompareExchange來操作進(jìn)出棧。HndData采用單向FIFO雙鎖并發(fā)鏈表來管理出入列操作。其他小內(nèi)存需求的均采用靜態(tài)數(shù)組或new操作。
五、內(nèi)存需求
每個(gè)IoData等于一個(gè)分頁(yè)內(nèi)存大小,信息頭大小為36Byte,有效使用內(nèi)存是4060Byte,因此對(duì)GTcpSvr_AllocGBuf獲得的內(nèi)存寫入時(shí)不應(yīng)該超過4060(調(diào)用GTcpSvr_GetGbufSize獲得),所有IoData占用系統(tǒng)內(nèi)存是:IoDataCount * PageSize(4096)。每個(gè)HndData大小是128Byte,加上每個(gè)Socket分配時(shí)耗內(nèi)存約是:540Bytes(此為估計(jì)值,應(yīng)以MS技術(shù)文檔為準(zhǔn)),所有HndData耗系統(tǒng)內(nèi)存是:HndDataCount * MAX_HNDDATA_AND_SOCKET_SIZE(128 + 540)。其他變量和數(shù)組可能耗得內(nèi)存在10M之下。
綜上,整個(gè)模塊需求內(nèi)存量是:UseMemSize = IoDataCount * PageSize + HndDataCount * MAX_HNDDATA_AND_SOCKET_SIZE + 10M。
一、受限制庫(kù)Dll和lib說明:
庫(kù)文件G-TcpServer.lib、G-TcpServer.Dll是受限制的試用版本和Demo配套。
1、最大連接不能超過50
2、發(fā)送字節(jié)數(shù)不能超過50
3、不能設(shè)置0讀投遞、無超時(shí)機(jī)制
4、其他功能限制
二、版本解讀說明
1、版本名帶T的表示是受限制的試用版
2、版本名帶bata表示非正式版
3、版本名帶WChar表示支持WideChar
4、版本號(hào)以時(shí)間格式累加計(jì)數(shù)(60進(jìn)1)和顯示
三、文件“G-TcpServer無限制體驗(yàn)版.exe”是無限制的體驗(yàn)版。
四、文件夾
1、Demos文件夾是VC Lib、Dll庫(kù)及Delphi2010的例程源碼,供開發(fā)學(xué)習(xí)
2、G-Sockets文件夾是Lib和Dll庫(kù)的Delphi和VC的頭文件
3、Release\G-Sockets\Dll文件夾是動(dòng)態(tài)庫(kù)的輸出文件夾
4、Release\G-Sockets\Lib文件夾是靜態(tài)庫(kù)的輸出文件夾
1、模塊包含處理線程、工作線程和看守線程。
工作線程負(fù)責(zé)IO投遞工作,并響應(yīng)投遞返回,再把接收的數(shù)據(jù)投遞給處理線程,處理線程調(diào)用回調(diào)函數(shù)給應(yīng)用層,以此可以在通訊層和應(yīng)用層之間現(xiàn)實(shí)0拷貝數(shù)據(jù)的功能。模塊只有一個(gè)
看守線程,負(fù)責(zé):a、響應(yīng)Accept事件并投遞接受隊(duì)列;b、效驗(yàn)接受超時(shí)(即只連接不發(fā)數(shù)據(jù))斷開連接,防止空連接;c、效驗(yàn)空閑超時(shí)(即心跳超時(shí))斷開連接。
按工作量來分,最繁重的是處理線程,其次是工作線程,最閑的是看守線程。可通過OnThread事件回調(diào)函數(shù)設(shè)置線程權(quán)限。在此線程模式下,應(yīng)用層可以在回調(diào)函數(shù)里處理數(shù)據(jù)而不必再建立另外的數(shù)據(jù)處理線程池。
2、線程平衡
為使連接能平衡使用處理線程,每個(gè)連接同時(shí)只有一個(gè)處理線程處理工作線程投遞過來的IO返回事件并調(diào)用回調(diào)函數(shù)通知應(yīng)用層。
3、收發(fā)平衡
為使連接能平衡使用IO設(shè)備,每個(gè)連接同時(shí)只能投遞一個(gè)讀請(qǐng)求,并通過線程平衡機(jī)制保證接收的數(shù)據(jù)是按順序的被處理線程處理及通過回調(diào)函數(shù)傳遞給應(yīng)用層;同時(shí)也只能投遞一個(gè)寫請(qǐng)求,其余寫請(qǐng)求都按順序放在寫隊(duì)列里面。讀寫同步都使用臨界段。
4、0拷貝技術(shù)
接收數(shù)據(jù)0拷貝看1項(xiàng);提供GTcpSvr_AllocGBuf()、GTcpSvr_FreeGBuf()和GTcpSvr_PostSendGBuf()三個(gè)函數(shù)實(shí)現(xiàn)發(fā)送數(shù)據(jù)的0拷貝。
5、0讀投遞
為避免內(nèi)核鎖定分頁(yè)內(nèi)存過多,可通過設(shè)置來采用0讀投遞來降低吞吐性能從而實(shí)現(xiàn)大連接量。
6、HndData回收
HndData回收有多種方法,但額外會(huì)在收發(fā)數(shù)據(jù)這兩個(gè)頻率操作上增加工作量,因此盡量避免在這兩個(gè)操作時(shí)做太多的工作是有必要的。模塊均不采用“投遞計(jì)數(shù)”或“投遞鏈表”的方式來判斷回收HndData的時(shí)機(jī),而是一旦斷線立即回收,其他未決投遞繼續(xù)返回時(shí)只處理IoData,不對(duì)HndData做任何寫操作。同時(shí)為避免HndData剛收回來但其未決投遞還沒有完全返回之前就立即被利用的可能性,HndData池采用了FIFO雙鎖并發(fā)鏈表,該鏈表通過ExNumber值來實(shí)現(xiàn)在最大連接情況下HndData池還有ExNumber個(gè)數(shù)量使鏈表不為NULL,通過設(shè)置ExNumber數(shù)量可實(shí)現(xiàn)控制鏈表末端的HndData出列時(shí)間,在這個(gè)時(shí)間內(nèi)可以保證斷開剛回收的HndData的未決投遞能夠完全返回。
HndData池,初始時(shí)如下:
HD1 + HD2 + HD... + HDMaxConnection + HDEx1 + HDEx2 + HDEx... + HDExNumber
| |
Head------------------------------------------------------------------Tail
達(dá)到最大連接時(shí)如下:
HDEx1 + HDEx2 + HDEx... + HDExNumber
| |
Head---------------------------Tail
斷開回收一個(gè)HndData(HD)后如下:
HDEx1 + HDEx2 + HDEx... + HDExNumber + HD
| |
Head-------(需要T時(shí)間HD才能出列)------Tail
注:T可以通過控制ExNumber值來實(shí)現(xiàn),假定每秒最大可以處理C個(gè)連接和斷開,需要延時(shí)T秒所有未決投遞才會(huì)完全回收,那么:ExNumber = T * (MaxConnection / C)。實(shí)際上每個(gè)連接未決投遞非常少(因?yàn)樽x寫是單投遞的),并且工作線程并不處理數(shù)據(jù)工作量不大,因此T很短,模塊默認(rèn)是3秒。對(duì)于服務(wù)器而已,一秒能接受的連接量是可知預(yù)計(jì)的,模塊默認(rèn)是1萬,假定MaxConnection=C所以ExNumber是3萬。但實(shí)際應(yīng)用中,正常情況下連接率遠(yuǎn)少于1萬/S,尤其是長(zhǎng)連接的服務(wù)器,即使是短連接的服務(wù)器也不會(huì)發(fā)生這樣的連接率。可能的情況是DOS,如果是影響也不大,因?yàn)檫€有MaxConnection控制,超過這個(gè)數(shù)的連接就立即被CloseSocket了。和頻率高的數(shù)據(jù)收發(fā)相比,斷線、連接的頻率遠(yuǎn)少于它,在頻率低的地方上多做多點(diǎn)工作總比在頻率高的地方多做一點(diǎn)工作的好。
7、可伸縮性
IoData數(shù)量可根據(jù)初始需要設(shè)置,資源不足時(shí)模塊自動(dòng)向系統(tǒng)申請(qǐng)內(nèi)存。為保證HndData的安全性,HndData池還設(shè)置了延時(shí)出列,剛回收的HndData入列時(shí)間必須超過3(或更長(zhǎng))秒鐘,如果未達(dá)到3秒的,模塊自動(dòng)向系統(tǒng)申請(qǐng)內(nèi)存。
8、內(nèi)存管理
IoData和HndData均采用VirtualAlloc和VirtualFree來向系統(tǒng)操作內(nèi)存。IoData池采用原子函數(shù)InterlockedCompareExchange來操作進(jìn)出棧。HndData采用單向FIFO雙鎖并發(fā)鏈表來管理出入列操作。其他小內(nèi)存需求的均采用靜態(tài)數(shù)組或new操作。
五、內(nèi)存需求
每個(gè)IoData等于一個(gè)分頁(yè)內(nèi)存大小,信息頭大小為36Byte,有效使用內(nèi)存是4060Byte,因此對(duì)GTcpSvr_AllocGBuf獲得的內(nèi)存寫入時(shí)不應(yīng)該超過4060(調(diào)用GTcpSvr_GetGbufSize獲得),所有IoData占用系統(tǒng)內(nèi)存是:IoDataCount * PageSize(4096)。每個(gè)HndData大小是128Byte,加上每個(gè)Socket分配時(shí)耗內(nèi)存約是:540Bytes(此為估計(jì)值,應(yīng)以MS技術(shù)文檔為準(zhǔn)),所有HndData耗系統(tǒng)內(nèi)存是:HndDataCount * MAX_HNDDATA_AND_SOCKET_SIZE(128 + 540)。其他變量和數(shù)組可能耗得內(nèi)存在10M之下。
綜上,整個(gè)模塊需求內(nèi)存量是:UseMemSize = IoDataCount * PageSize + HndDataCount * MAX_HNDDATA_AND_SOCKET_SIZE + 10M。
代碼片段和文件信息
//?G-TcpServerLibDemo.cpp?:?定義應(yīng)用程序的類行為。
//
#include?“stdafx.h“
#include?“G-TcpServerDemo.h“
#include?“G-TcpServerDemoDlg.h“
#ifdef?_DEBUG
#define?new?DEBUG_NEW
#endif
//?CGTcpServerDemoApp
BEGIN_MESSAGE_MAP(CGTcpServerDemoApp?CWinApp)
ON_COMMAND(ID_HELP?&CWinApp::onhelp)
END_MESSAGE_MAP()
//?CGTcpServerDemoApp?構(gòu)造
CGTcpServerDemoApp::CGTcpServerDemoApp()
{
//?TODO:?在此處添加構(gòu)造代碼,
//?將所有重要的初始化放置在?InitInstance?中
}
//?唯一的一個(gè)?CGTcpServerDemoApp?對(duì)象
CGTcpServerDemoApp?theApp;
//?CGTcpServerDemoApp?初始化
BOOL?CGTcpServerDemoApp::InitInstance()
{
//?如果一個(gè)運(yùn)行在?Windows?XP?上的應(yīng)用程序清單指定要
//?使用?ComCtl32.dll?版本?6?或更高版本來啟用可視化方式,
//則需要?InitCommonControlsEx()。否則,將無法創(chuàng)建窗口。
INITCOMMONCONTROLSEX?InitCtrls;
InitCtrls.dwSize?=?sizeof(InitCtrls);
//?將它設(shè)置為包括所有要在應(yīng)用程序中使用的
//?公共控件類。
InitCtrls.dwICC?=?ICC_WIN95_CLASSES;
InitCommonControlsEx(&InitCtrls);
CWinApp::InitInstance();
//?標(biāo)準(zhǔn)初始化
//?如果未使用這些功能并希望減小
//?最終可執(zhí)行文件的大小,則應(yīng)移除下列
//?不需要的特定初始化例程
//?更改用于存儲(chǔ)設(shè)置的注冊(cè)表項(xiàng)
//?TODO:?應(yīng)適當(dāng)修改該字符串,
//?例如修改為公司或組織名
SetRegistryKey(_T(“應(yīng)用程序向?qū)傻谋镜貞?yīng)用程序“));
CGTcpServerDemoDlg?dlg;
m_pMainWnd?=?&dlg;
INT_PTR?nResponse?=?dlg.DoModal();
if?(nResponse?==?IDOK)
{
//?TODO:?在此放置處理何時(shí)用
//??“確定”來關(guān)閉對(duì)話框的代碼
}
else?if?(nResponse?==?IDCANCEL)
{
//?TODO:?在此放置處理何時(shí)用
//??“取消”來關(guān)閉對(duì)話框的代碼
}
//?由于對(duì)話框已關(guān)閉,所以將返回?FALSE?以便退出應(yīng)用程序,
//??而不是啟動(dòng)應(yīng)用程序的消息泵。
return?FALSE;
}
?屬性????????????大小?????日期????時(shí)間???名稱
-----------?---------??----------?-----??----
?????文件????????678??2010-04-29?22:29??說明.txt
?????文件??????45008??2010-04-29?22:29??Demos\G-TcpServerDemo\G-TcpServerDemo.aps
?????文件???????1724??2010-04-29?22:29??Demos\G-TcpServerDemo\G-TcpServerDemo.cpp
?????文件????????497??2010-04-29?22:29??Demos\G-TcpServerDemo\G-TcpServerDemo.h
?????文件???????6337??2010-04-29?22:29??Demos\G-TcpServerDemo\G-TcpServerDemo.rc
?????文件??????18852??2010-04-29?22:29??Demos\G-TcpServerDemo\G-TcpServerDemoDlg.cpp
?????文件???????1581??2010-04-29?22:29??Demos\G-TcpServerDemo\G-TcpServerDemoDlg.h
?????文件???????5853??2010-04-29?22:29??Demos\G-TcpServerDemo\G-TcpServerDllDemo.vcproj
?????文件???????1411??2010-04-29?22:29??Demos\G-TcpServerDemo\G-TcpServerDllDemo.vcproj.LEMO139.Administrator.user
?????文件???????1425??2010-04-29?22:29??Demos\G-TcpServerDemo\G-TcpServerDllDemo.vcproj.WINXP-20100323.Administrator.user
?????文件???????6007??2010-04-29?22:29??Demos\G-TcpServerDemo\G-TcpServerLibDemo.vcproj
?????文件???????1411??2010-04-29?22:29??Demos\G-TcpServerDemo\G-TcpServerLibDemo.vcproj.LEMO139.Administrator.user
?????文件???????1425??2010-04-29?22:29??Demos\G-TcpServerDemo\G-TcpServerLibDemo.vcproj.WINXP-20100323.Administrator.user
?????文件??????21630??2010-04-29?22:29??Demos\G-TcpServerDemo\res\G-TcpServerDemo.ico
?????文件????????373??2010-04-29?22:29??Demos\G-TcpServerDemo\res\G-TcpServerDemo.rc2
?????文件???????3128??2010-04-29?22:29??Demos\G-TcpServerDemo\resource.h
?????文件????????149??2010-04-29?22:29??Demos\G-TcpServerDemo\stdafx.cpp
?????文件???????1745??2010-04-29?22:29??Demos\G-TcpServerDemo\stdafx.h
?????文件???????1024??2010-04-29?22:29??Demos\G-TcpServerDemo\targetver.h
?????文件????????504??2010-04-29?22:29??Demos\G-TcpServerDemoD2010\G_TcpServerDemoD2010.dpr
?????文件???????4694??2010-04-29?22:29??Demos\G-TcpServerDemoD2010\G_TcpServerDemoD2010.dproj
?????文件?????????62??2010-04-29?22:29??Demos\G-TcpServerDemoD2010\G_TcpServerDemoD2010.dproj.local
?????文件????????356??2010-04-29?22:29??Demos\G-TcpServerDemoD2010\G_TcpServerDemoD2010.identcache
?????文件???????5280??2010-04-29?22:29??Demos\G-TcpServerDemoD2010\G_TcpServerDemoD2010.res
?????文件???????6741??2010-04-29?22:29??Demos\G-TcpServerDemoD2010\uGTcpServerDemoMainForm.dfm
?????文件??????10649??2010-04-29?22:29??Demos\G-TcpServerDemoD2010\uGTcpServerDemoMainForm.pas
?????文件????????917??2010-04-29?22:29??Demos\G-TcpServerDllDemo.sln
?????文件????????917??2010-04-29?22:29??Demos\G-TcpServerLibDemo.sln
?????文件??????37420??2010-04-29?22:29??Demos\G-TcpSvrRunInfo\G-TcpSvrRunInfo.aps
?????文件??????12455??2010-04-29?22:29??Demos\G-TcpSvrRunInfo\G-TcpSvrRunInfo.cpp
............此處省略27個(gè)文件信息
評(píng)論
共有 條評(píng)論