资源简介
说明
一、受限制库Dll和lib说明:
库文件G-TcpServer.lib、G-TcpServer.Dll是受限制的试用版本和Demo配套。
1、最大连接不能超过50
2、发送字节数不能超过50
3、不能设置0读投递、无超时机制
4、其他功能限制
二、版本解读说明
1、版本名带T的表示是受限制的试用版
2、版本名带bata表示非正式版
3、版本名带WChar表示支持WideChar
4、版本号以时间格式累加计数(60进1)和显示
三、文件“G-TcpServer无限制体验版.exe”是无限制的体验版。
四、文件夹
1、Demos文件夹是VC Lib、Dll库及Delphi2010的例程源码,供开发学习
2、G-Sockets文件夹是Lib和Dll库的Delphi和VC的头文件
3、Release\G-Sockets\Dll文件夹是动态库的输出文件夹
4、Release\G-Sockets\Lib文件夹是静态库的输出文件夹
1、模块包含处理线程、工作线程和看守线程。
工作线程负责IO投递工作,并响应投递返回,再把接收的数据投递给处理线程,处理线程调用回调函数给应用层,以此可以在通讯层和应用层之间现实0拷贝数据的功能。模块只有一个
看守线程,负责:a、响应Accept事件并投递接受队列;b、效验接受超时(即只连接不发数据)断开连接,防止空连接;c、效验空闲超时(即心跳超时)断开连接。
按工作量来分,最繁重的是处理线程,其次是工作线程,最闲的是看守线程。可通过OnThread事件回调函数设置线程权限。在此线程模式下,应用层可以在回调函数里处理数据而不必再建立另外的数据处理线程池。
2、线程平衡
为使连接能平衡使用处理线程,每个连接同时只有一个处理线程处理工作线程投递过来的IO返回事件并调用回调函数通知应用层。
3、收发平衡
为使连接能平衡使用IO设备,每个连接同时只能投递一个读请求,并通过线程平衡机制保证接收的数据是按顺序的被处理线程处理及通过回调函数传递给应用层;同时也只能投递一个写请求,其余写请求都按顺序放在写队列里面。读写同步都使用临界段。
4、0拷贝技术
接收数据0拷贝看1项;提供GTcpSvr_AllocGBuf()、GTcpSvr_FreeGBuf()和GTcpSvr_PostSendGBuf()三个函数实现发送数据的0拷贝。
5、0读投递
为避免内核锁定分页内存过多,可通过设置来采用0读投递来降低吞吐性能从而实现大连接量。
6、HndData回收
HndData回收有多种方法,但额外会在收发数据这两个频率操作上增加工作量,因此尽量避免在这两个操作时做太多的工作是有必要的。模块均不采用“投递计数”或“投递链表”的方式来判断回收HndData的时机,而是一旦断线立即回收,其他未决投递继续返回时只处理IoData,不对HndData做任何写操作。同时为避免HndData刚收回来但其未决投递还没有完全返回之前就立即被利用的可能性,HndData池采用了FIFO双锁并发链表,该链表通过ExNumber值来实现在最大连接情况下HndData池还有ExNumber个数量使链表不为NULL,通过设置ExNumber数量可实现控制链表末端的HndData出列时间,在这个时间内可以保证断开刚回收的HndData的未决投递能够完全返回。
HndData池,初始时如下:
HD1 + HD2 + HD... + HDMaxConnection + HDEx1 + HDEx2 + HDEx... + HDExNumber
| |
Head------------------------------------------------------------------Tail
达到最大连接时如下:
HDEx1 + HDEx2 + HDEx... + HDExNumber
| |
Head---------------------------Tail
断开回收一个HndData(HD)后如下:
HDEx1 + HDEx2 + HDEx... + HDExNumber + HD
| |
Head-------(需要T时间HD才能出列)------Tail
注:T可以通过控制ExNumber值来实现,假定每秒最大可以处理C个连接和断开,需要延时T秒所有未决投递才会完全回收,那么:ExNumber = T * (MaxConnection / C)。实际上每个连接未决投递非常少(因为读写是单投递的),并且工作线程并不处理数据工作量不大,因此T很短,模块默认是3秒。对于服务器而已,一秒能接受的连接量是可知预计的,模块默认是1万,假定MaxConnection=C所以ExNumber是3万。但实际应用中,正常情况下连接率远少于1万/S,尤其是长连接的服务器,即使是短连接的服务器也不会发生这样的连接率。可能的情况是DOS,如果是影响也不大,因为还有MaxConnection控制,超过这个数的连接就立即被CloseSocket了。和频率高的数据收发相比,断线、连接的频率远少于它,在频率低的地方上多做多点工作总比在频率高的地方多做一点工作的好。
7、可伸缩性
IoData数量可根据初始需要设置,资源不足时模块自动向系统申请内存。为保证HndData的安全性,HndData池还设置了延时出列,刚回收的HndData入列时间必须超过3(或更长)秒钟,如果未达到3秒的,模块自动向系统申请内存。
8、内存管理
IoData和HndData均采用VirtualAlloc和VirtualFree来向系统操作内存。IoData池采用原子函数InterlockedCompareExchange来操作进出栈。HndData采用单向FIFO双锁并发链表来管理出入列操作。其他小内存需求的均采用静态数组或new操作。
五、内存需求
每个IoData等于一个分页内存大小,信息头大小为36Byte,有效使用内存是4060Byte,因此对GTcpSvr_AllocGBuf获得的内存写入时不应该超过4060(调用GTcpSvr_GetGbufSize获得),所有IoData占用系统内存是:IoDataCount * PageSize(4096)。每个HndData大小是128Byte,加上每个Socket分配时耗内存约是:540Bytes(此为估计值,应以MS技术文档为准),所有HndData耗系统内存是:HndDataCount * MAX_HNDDATA_AND_SOCKET_SIZE(128 + 540)。其他变量和数组可能耗得内存在10M之下。
综上,整个模块需求内存量是:UseMemSize = IoDataCount * PageSize + HndDataCount * MAX_HNDDATA_AND_SOCKET_SIZE + 10M。
一、受限制库Dll和lib说明:
库文件G-TcpServer.lib、G-TcpServer.Dll是受限制的试用版本和Demo配套。
1、最大连接不能超过50
2、发送字节数不能超过50
3、不能设置0读投递、无超时机制
4、其他功能限制
二、版本解读说明
1、版本名带T的表示是受限制的试用版
2、版本名带bata表示非正式版
3、版本名带WChar表示支持WideChar
4、版本号以时间格式累加计数(60进1)和显示
三、文件“G-TcpServer无限制体验版.exe”是无限制的体验版。
四、文件夹
1、Demos文件夹是VC Lib、Dll库及Delphi2010的例程源码,供开发学习
2、G-Sockets文件夹是Lib和Dll库的Delphi和VC的头文件
3、Release\G-Sockets\Dll文件夹是动态库的输出文件夹
4、Release\G-Sockets\Lib文件夹是静态库的输出文件夹
1、模块包含处理线程、工作线程和看守线程。
工作线程负责IO投递工作,并响应投递返回,再把接收的数据投递给处理线程,处理线程调用回调函数给应用层,以此可以在通讯层和应用层之间现实0拷贝数据的功能。模块只有一个
看守线程,负责:a、响应Accept事件并投递接受队列;b、效验接受超时(即只连接不发数据)断开连接,防止空连接;c、效验空闲超时(即心跳超时)断开连接。
按工作量来分,最繁重的是处理线程,其次是工作线程,最闲的是看守线程。可通过OnThread事件回调函数设置线程权限。在此线程模式下,应用层可以在回调函数里处理数据而不必再建立另外的数据处理线程池。
2、线程平衡
为使连接能平衡使用处理线程,每个连接同时只有一个处理线程处理工作线程投递过来的IO返回事件并调用回调函数通知应用层。
3、收发平衡
为使连接能平衡使用IO设备,每个连接同时只能投递一个读请求,并通过线程平衡机制保证接收的数据是按顺序的被处理线程处理及通过回调函数传递给应用层;同时也只能投递一个写请求,其余写请求都按顺序放在写队列里面。读写同步都使用临界段。
4、0拷贝技术
接收数据0拷贝看1项;提供GTcpSvr_AllocGBuf()、GTcpSvr_FreeGBuf()和GTcpSvr_PostSendGBuf()三个函数实现发送数据的0拷贝。
5、0读投递
为避免内核锁定分页内存过多,可通过设置来采用0读投递来降低吞吐性能从而实现大连接量。
6、HndData回收
HndData回收有多种方法,但额外会在收发数据这两个频率操作上增加工作量,因此尽量避免在这两个操作时做太多的工作是有必要的。模块均不采用“投递计数”或“投递链表”的方式来判断回收HndData的时机,而是一旦断线立即回收,其他未决投递继续返回时只处理IoData,不对HndData做任何写操作。同时为避免HndData刚收回来但其未决投递还没有完全返回之前就立即被利用的可能性,HndData池采用了FIFO双锁并发链表,该链表通过ExNumber值来实现在最大连接情况下HndData池还有ExNumber个数量使链表不为NULL,通过设置ExNumber数量可实现控制链表末端的HndData出列时间,在这个时间内可以保证断开刚回收的HndData的未决投递能够完全返回。
HndData池,初始时如下:
HD1 + HD2 + HD... + HDMaxConnection + HDEx1 + HDEx2 + HDEx... + HDExNumber
| |
Head------------------------------------------------------------------Tail
达到最大连接时如下:
HDEx1 + HDEx2 + HDEx... + HDExNumber
| |
Head---------------------------Tail
断开回收一个HndData(HD)后如下:
HDEx1 + HDEx2 + HDEx... + HDExNumber + HD
| |
Head-------(需要T时间HD才能出列)------Tail
注:T可以通过控制ExNumber值来实现,假定每秒最大可以处理C个连接和断开,需要延时T秒所有未决投递才会完全回收,那么:ExNumber = T * (MaxConnection / C)。实际上每个连接未决投递非常少(因为读写是单投递的),并且工作线程并不处理数据工作量不大,因此T很短,模块默认是3秒。对于服务器而已,一秒能接受的连接量是可知预计的,模块默认是1万,假定MaxConnection=C所以ExNumber是3万。但实际应用中,正常情况下连接率远少于1万/S,尤其是长连接的服务器,即使是短连接的服务器也不会发生这样的连接率。可能的情况是DOS,如果是影响也不大,因为还有MaxConnection控制,超过这个数的连接就立即被CloseSocket了。和频率高的数据收发相比,断线、连接的频率远少于它,在频率低的地方上多做多点工作总比在频率高的地方多做一点工作的好。
7、可伸缩性
IoData数量可根据初始需要设置,资源不足时模块自动向系统申请内存。为保证HndData的安全性,HndData池还设置了延时出列,刚回收的HndData入列时间必须超过3(或更长)秒钟,如果未达到3秒的,模块自动向系统申请内存。
8、内存管理
IoData和HndData均采用VirtualAlloc和VirtualFree来向系统操作内存。IoData池采用原子函数InterlockedCompareExchange来操作进出栈。HndData采用单向FIFO双锁并发链表来管理出入列操作。其他小内存需求的均采用静态数组或new操作。
五、内存需求
每个IoData等于一个分页内存大小,信息头大小为36Byte,有效使用内存是4060Byte,因此对GTcpSvr_AllocGBuf获得的内存写入时不应该超过4060(调用GTcpSvr_GetGbufSize获得),所有IoData占用系统内存是:IoDataCount * PageSize(4096)。每个HndData大小是128Byte,加上每个Socket分配时耗内存约是:540Bytes(此为估计值,应以MS技术文档为准),所有HndData耗系统内存是:HndDataCount * MAX_HNDDATA_AND_SOCKET_SIZE(128 + 540)。其他变量和数组可能耗得内存在10M之下。
综上,整个模块需求内存量是:UseMemSize = IoDataCount * PageSize + HndDataCount * MAX_HNDDATA_AND_SOCKET_SIZE + 10M。
代码片段和文件信息
// G-TcpServerLibDemo.cpp : 定义应用程序的类行为。
//
#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 构造
CGTcpServerDemoApp::CGTcpServerDemoApp()
{
// TODO: 在此处添加构造代码,
// 将所有重要的初始化放置在 InitInstance 中
}
// 唯一的一个 CGTcpServerDemoApp 对象
CGTcpServerDemoApp theApp;
// CGTcpServerDemoApp 初始化
BOOL CGTcpServerDemoApp::InitInstance()
{
// 如果一个运行在 Windows XP 上的应用程序清单指定要
// 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
//则需要 InitCommonControlsEx()。否则,将无法创建窗口。
INITCOMMONCONTROLSEX InitCtrls;
InitCtrls.dwSize = sizeof(InitCtrls);
// 将它设置为包括所有要在应用程序中使用的
// 公共控件类。
InitCtrls.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&InitCtrls);
CWinApp::InitInstance();
// 标准初始化
// 如果未使用这些功能并希望减小
// 最终可执行文件的大小,则应移除下列
// 不需要的特定初始化例程
// 更改用于存储设置的注册表项
// TODO: 应适当修改该字符串,
// 例如修改为公司或组织名
SetRegistryKey(_T(“应用程序向导生成的本地应用程序“));
CGTcpServerDemoDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: 在此放置处理何时用
// “确定”来关闭对话框的代码
}
else if (nResponse == IDCANCEL)
{
// TODO: 在此放置处理何时用
// “取消”来关闭对话框的代码
}
// 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
// 而不是启动应用程序的消息泵。
return FALSE;
}
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 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个文件信息
- 上一篇:单片机数字时钟包附电路图 源程序 几仿真图DSN
- 下一篇:unity3d反编译工具
相关资源
- SOCKET 网络编程 计算机网络 作业 客户
- linux 网络实验 ftp程序
- 用Socket写的简易FTP服务器和客户端
- socket小工具(可方便建立TCP UDP的soc
- socket客户端源码
- 基于CSocket的多人聊天室
- socket文件传输源码
- Socket自制系统
- HP用SOCKET实现(客户端---服务端)
- zeromq的windows版本安装包
- STM32分别以串口硬件SPI模拟并口驱动
- IOCP 一款远控的delphi源代码
- 《TCP/IP:协议分析与应用编程》课后
- linux下基于socket和curses的双人弹球游戏
- 计算机网络socket编程实验
- linux下socket can 编程详解
- FANUC机器人Socket Message通讯设置及使用
- Delphi简单实现局域网远程开机
- 易语言websocket服务器源码
- websocket规范 RFC6455 中文版
- 富士康H61S主板最新BIOS,支持22NCPU
- Socket-UDP整合消息接收,发送
- websocket-rtsp-proxy-test.zip
- 基于QTsocket的局域网聊天室
- SuperSocket服务端与客户端通信
- 网络编程socket文件图片等传送
- tomcat7.0.42 下部署websocket需要替换的包
- 安卓手机socket通信服务端和客户端
- 物联网,WEBSOCKET丰富案例
- nodejs聊天室
评论
共有 条评论