阅读更多

HP-Socket

  HP-Socket 是一套通用的高性能 Windows Socket 组件包,包含服务端组件(IOCP 模型)和客户端组件(Event Select 模型),广泛适用于 Windows 平台的 TCP 通信系统。HP-Socket 对通信层实现完全封装,上层应用不必关注通信层的任何细节;HP-Socket 提供基于事件通知模型的 API 接口,能非常简单高效地整合到各类应用程序中;另外,为了让大家能更方便的学习 HP-Socket,特此精心制作了一个功能测试示例(Test Echo)一个性能测试示例(Test Echo-PFM)和一个 PULL 模型测试示例(Test Echo-Pull),用户可以通过这两个测试示例入手,迅速掌握组件的设计思想和使用方法。

----------------------------------------------------------------

通用性

  • 通信组件的唯一职责就是接受和发送字节流,绝对不能参与上层协议解析等工作;
  • 与上层使用者解耦、互不依赖,组件与使用者通过操作接口和监听器接口进行交互,组件实现操作接口为上层提供操作方法;使用者实现监听器接口把自己注册为组件的 Listener,接收组件通知。因此,任何使用者只要实现了监听器接口都可以使用组件;另一方面,甚至可以自己重新写一个实现方式完全不同的组件实现给使用者调用,只要该组件遵从组件的操作接口,这也是 DIP 设计原则的体现。

可用性

  可用性对所有通用组件都是至关重要的,如果太难用还不如自己重头写一个来得方便。因此,组件的操作接口和监听器接口设计得尽量简单易用(通俗来说就是“傻瓜化”),这两个接口的主要方法均不超过 5 个。另外,组件完全封装了所有的底层 Socket 通信,上层应用看不到任何通信细节,不必也不能干预任何通信操作,Socket 连接被抽象为 Connection ID,该参数作为连接标识提供给上层应用识别不同的连接。

高性能

  作为底层的通用组件,性能问题是必须考虑的,绝对不能成为系统的瓶颈。而另一方面,从实际出发,根据客户端组件与服务端组件的性能要求采用不同的 Socket 模型。组件在设计上充分考虑了性能、现实使用情景、可用性和实现复杂性等因素,确保满足性能要求的同时又不会写得太复杂。做出以下两点设计决策:

  • 客户端:在单独线程中实现 Socket 通信交互。这样可以避免与主线程或其他线程相互干扰;I/O 模型选择 Event Select 通信模型。
  • 服务端:采用 Windows 平台效率最高的 IOCP 通信模型;利用缓存池技术,在通信的过程中,通常需要频繁的申请和释放内存缓冲区,建立了动态缓存池, 只有当缓存池中没有可用对象时才创建新对象,而当缓存对象过多时则会压缩缓存池;另外,组件的动态内存通过私有堆(Private Heap)机制分配,避免与 new / malloc 竞争同时又减少内存空洞。

伸缩性

  可以根据实际的使用环境要求设置组件的各项性能参数(如:工作线程的数量、各种缓存池的大小、收发缓冲区的大小、Socket 监听队列的大小、Accep 派发的数目以及心跳检查的间隔等)。

  (项目主页:点击这里,下载地址:点击这里)


*** v2.2.3 更新 ***

 > 连接 ID 的数据类型改为 ‘CONNID’:

-----------------

  1. 在SocketHelper.h 中定义 CONNID 数据类型(默认:typedef ULONG_PTR CONNID)
  2. 应用程序可以把 CONNID 定义为其希望的类型(如:ULONG / ULONGLONG 等)
  3. 为了便于移植与维护,应用程序的任何地方都应该用‘CONNID’类型引用连接 ID

> 服务端 Socket 组件支持为每个连接绑定附加数据:

-----------------

  1. IServerSocket 和 CIocpServer 增加方法 Get/SetConnectionExtra()
  2. 通过上述两个方法,应用程序可以为每个连接绑定任意附加数据并把数据获取出来

> 其它更新:

 -----------------

  1. 放宽 CIocpServer 的最大 IOCP 工作线程数目限制(64 改为 500)
  2. 服务端 Socket 组件的 Disconnect() 方法增加一个标识参数‘bForce’,指示是否强制断开连接
  3. 调整连接 ID 的生成规则,避免生成数值为 0 的连接 ID

*** v2.2.2 更新 ***

  > 优化心跳检测相关功能:

 -----------------

  1. IServerSocket 和 IClientSocket 的 Get/SetKeepAliveTimes() 方法改为 Get/SetKeepAliveTime()
  2. CIocpServer 和 CClientSocket 的默认 KeepAliveTime 属性改为 5000
  3. CIocpServer 和 CClientSocket 的默认 KeepAliveInterval 属性改为 3000

*** v2.2.1 更新 ***

> PULL 模型支持:

-----------------

  1. ISocketListener 增加 PULL 模型数据接收通知方法 OnReceive(dwConnID, int)
  2. 增加 PULL Socket 接口 IPullSocket,该接口的 Fetch(dwConnID, pBuffer, iLength) 方法用于抓取通信数据

> Server:

-----------------

  1. 服务端 Socket 接口 ISocketServer 改名为 IServerSocket
  2. 增加 PULL Server Socket 监听器抽象类 CPullServerSocketListener
  3. 增加 PULL Server Socket 接口 IPullServerSocket
  4. 增加 PULL Server Socket 实现类 CIocpPullServer

> Client:

-----------------

  1. 客户端 Socket 接口 ISocketClient 改名为 IClientSocket
  2. 客户端 Socket 实现类 CSocketClient 改名为 CClientSocket
  3. 增加 PULL Client Socket 监听器抽象类 CPullClientSocketListener
  4. 增加 PULL Client Socket 接口 IPullClientSocket
  5. 增加 PULL Client Socket 实现类 CPullClientSocket  

> 其它更新:
-----------------

  1. 增加 PULL Socket 测试程序 TestEcho-Pull
  2. 在 SocketHelper.h (.cpp) 中添加若干帮助结构体

11
0
评论 共 8 条 请登录后发表评论
8 楼 guaishou 2013-08-29 20:11
codepat 写道
很不错,正在用。

欢迎多提意见
7 楼 xoxoj 2013-08-29 17:55
支持支持~~~
6 楼 codepat 2013-08-29 17:28
很不错,正在用。
5 楼 yccn 2013-08-29 12:42
虽然只会java,但是在群里作者很热心,有问题第一时间就能做出回应,赞!
4 楼 guaishou 2013-08-29 12:24
nevermindex 写道
作者的敬业精神和奉献精神很让我佩服。

U R Welcome ~~~
3 楼 nevermindex 2013-08-29 11:54
作者的敬业精神和奉献精神很让我佩服。
2 楼 guaishou 2013-08-29 11:09
gpqhl0071 写道
有时间研究研究。

一定让你喜欢~
1 楼 gpqhl0071 2013-08-29 11:05
有时间研究研究。

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 高性能 Windows Socket 组件 HP-Socket v3.0.2 正式发布

    HP-Socket 是一套通用的高性能 Windows Socket 组件包,包含服务端组件(IOCP 模型)和客户端组件(Event Select 模型),广泛适用于 Windows 平台的 TCP/UDP 通信系统。HP-Socket 对通信层实现完全封装,上层应用...

  • 高性能 Windows Socket 组件 HP-Socket v3.0.1 正式发布

     HP-Socket 是一套通用的高性能 Windows Socket 组件包,包含服务端组件(IOCP 模型)和客户端组件(Event Select 模型),广泛适用于 Windows 平台的 TCP/UDP 通信系统。HP-Socket 对通信层实现完全封装,上层应用...

  • 判断一个字符串能否成为合法的文件名

    windows里面,文件名的命名规则:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/naming_a_file.asp按照这个规则,有人写了一个函数:http://www.codeproject.com/file/isvalidfilename.aspMS为什么不提供一个这样的函数呢?

  • 用CString作为Key使用CMap

    遇到好几个人说CMap在用CString做key类型时有问题,说用int和DWORD就可以,用CString就不行。因此很多人推荐使用MFC中的CMapStringToPtr之类。看下面的代码://.h    CMap typeMap;//.cpp    typeMap.SetAt(_T("ONE"),1);    typeMap.SetAt(_T("TWO"),2);    int nValue

  • 关于软件地域化(Localization)中的一些问题(zz)

    //zz from http://xiaogi.nease.net/article/translate.htm 随着中国经济势力的不断增强,对外开放的逐渐加深,中国软件业正面临着前所未有的挑战和机遇,要想在这次挑战中把握机遇,中国的软件必须走出国门,接受世界的检验,同时国际软件必须引进国门,以刺激并激励我国软件业的发展。在这个过程当中,软件地域化是个颇为关键的环节,因此也越来越引起人们的注意。 笔

  • 在任务栏上显示/隐藏窗口

    在任务栏上显示/隐藏窗口WS_EX_APPWINDOW Forces a top-level window onto the taskbar when the window is visible. 这个属性在对话框的属性页中是找不到的,可以直接在.rc中编辑。另外,WS_EX_TOOLWINDOW也可以在任务栏上隐藏窗口,但是那个窗口的标题栏会使用小字体。WS_EX_TOOLWINDOW   Cr

  • #define _WIN32_WINNT 0x0500

    #define _WIN32_WINNT 0x0500今天写一个函数,用到CoCreateInstanceEx,编译的时候总是为未定义,明明已经加头文件了,真是怒了,用vc也不是一两天了,不会被一个明明存在的函数名却说没有定义憋死吧后来直接到objbase.h中看源码,看到这么一句:#if (_WIN32_WINNT >= 0x0400 ) || defined(_WIN32_DCOM) // D

  • Create和OnCreate的关系

    某个CWnd的Create函数由当前CWnd的Owner调用, 而在CWnd::Create中,又会调用OnCreate函数,但是实际上这个时候Create函数还没有退出,CWnd的某些部分还没有创建好。所以,在CToolBar::OnCreate中,不能调用CommandToIndex,因为CommandToIndex需要等CToolBar全部创建好之后(CToolBar::Create退出)才

  • Re: WS_CLIPSIBLINGS是什么意思

    Re: WS_CLIPSIBLINGS是什么意思发信站: 饮水思源 (2004年09月19日16:24:43 星期天), 转信所有的overlapped窗口和popup窗口,都有WS_CLIPSIBLINGS 属性,这些窗口不能在它的sibling窗口上绘图对于child窗口,如果没有这个属性,它能在它的sibling窗口上绘图                 +-----------+     

  • http://www.codeguru.com/Cpp/W-D/splitter/tutorials/article.php/c6881/ BiSplitter

    http://www.codeguru.com/Cpp/W-D/splitter/tutorials/article.php/c6881/   BiSplitter

  • 关于CCmdUI

    关于CCmdUI阅读MFC源代码void CFrameWnd::OnInitMenuPopup(CMenu* pMenu, UINT nIndex, BOOL bSysMenu),void CWnd::UpdateDialogControls(CCmdTarget* pTarget, BOOL bDisableIfNoHndler)还没有仔细看,但是csdn上有大牛指了个方向,先记下来,过几天再看

  • 关于“VC编码规范 ”-评一篇blog

    看了一篇blog文章“摘:VC编码规范document.title="摘:VC编码规范 - "+document.title ”(http://blog.csdn.net/lts007007/archive/2006/01/05/571377.aspx),有几点意见:函数名中用下划线,我觉得不好,ceate_point()我觉得可以写成CreatePoint(),这样的风格才是Window

  • 解决Windows 程序界面闪烁问题的一些经验 (转载)

    http://blog.joycode.com/yaodong/archive/2004/11/26/39764.aspx解决Windows 程序界面闪烁问题的一些经验 一般的windows 复杂的界面需要使用多层窗口而且要用贴图来美化,所以不可避免在窗口移动或者改变大小的时候出现闪烁。先来谈谈闪烁产生的原因原因一:如果熟悉显卡原理的话,调用GDI函数向屏幕输出的时候并不是立刻就显

  • MFC8和MFC4.2在源码级不是兼容的

    举例证明:在mfc8中,void CFrameWnd::OnClose(){ if (m_lpfnCloseProc != NULL)  (*m_lpfnCloseProc)(this); // Note: only queries the active document CDocument* pDocument = GetActiveDocument(); ... ...而在mfc4.2中,vo

  • Tab stop in CFileDialog and CTabCtrl

    When we add some controls to create a new costumered CFileDialog, its hard to nevigate to the new added controls by pressing tab key.The solution is to add WS_EX_CONTROLPARENT to the dialog, Cool!Fro

  • How To Drawing Transparent Bitmaps

    TransparentBlt, But I think you should look at http://support.microsoft.com/default.aspx?scid=kb;en-us;79212 before you use this function.And I really recommand you look at http://www.winprog.net/tuto

  • CDC中的Clipping Functions

    以前一直不理解SelectClipRgn的含义。主要是不明白英语的clip对应中文中的什么操作。现在才彻底明白了。举例说:我想从左上角到右下脚画一条线,但是希望只在屏幕中间一个小矩形中有显示,这个时候,就把中间那个小矩形设为clip rgn就可以了,呵呵在mfc中,clip rgn在打印、打印预览中特别有用。

  • 【java毕业设计】校内跑腿业务系统源码(springboot+vue+mysql+说明文档).zip

    项目经过测试均可完美运行! 环境说明: 开发语言:java jdk:jdk1.8 数据库:mysql 5.7+ 数据库工具:Navicat11+ 管理工具:maven 开发工具:idea/eclipse

  • 【java毕业设计】大学志愿填报系统源码(springboot+vue+mysql+说明文档).zip

    项目经过测试均可完美运行! 环境说明: 开发语言:java jdk:jdk1.8 数据库:mysql 5.7+ 数据库工具:Navicat11+ 管理工具:maven 开发工具:idea/eclipse

Global site tag (gtag.js) - Google Analytics