阅读更多

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毕业设计】智慧社区教育服务门户.zip

    有java环境就可以运行起来 ,zip里包含源码+论文+PPT, 系统设计与功能: 文档详细描述了系统的后台管理功能,包括系统管理模块、新闻资讯管理模块、公告管理模块、社区影院管理模块、会员上传下载管理模块以及留言管理模块。 系统管理模块:允许管理员重新设置密码,记录登录日志,确保系统安全。 新闻资讯管理模块:实现新闻资讯的添加、删除、修改,确保主页新闻部分始终显示最新的文章。 公告管理模块:类似于新闻资讯管理,但专注于主页公告的后台管理。 社区影院管理模块:管理所有视频的添加、删除、修改,包括影片名、导演、主演、片长等信息。 会员上传下载管理模块:审核与删除会员上传的文件。 留言管理模块:回复与删除所有留言,确保系统内的留言得到及时处理。 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7及以上 数据库工具:Navicat11及以上 开发软件:eclipse/idea Maven包:Maven3.3及以上

  • 基于selenium的携程机票爬虫资料齐全+详细文档+高分项目+源码.zip

    【资源说明】 基于selenium的携程机票爬虫资料齐全+详细文档+高分项目+源码.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

Global site tag (gtag.js) - Google Analytics