DIOCP (一) DIOCP常见问题。
1,IOCP是什么?
答:IOCP是windows下的服务器技术,并不是所有windows都能使用IOCP,只能在支持IOCP的windows操作系统上使用。
2,DIOCP是什么?
答:DIOCP是Delphi实现的IOCP服务器。
3,DIOCP可以跨平台吗?
答:不可以,只能在支持IOCP的windows下使用,目前还没有可以跨平台使用的服务器技术;在Linux下的服务器技术是Epoll。
4,我可以用不同语言开发的客户端同DIOCP连接通讯吗?
答:完全可以,DIOCP建立socket,监听所有连接过来的socket,客户端只要能够用socket同DIOCP连接,就可以使用。
5,DIOCP对多颗CPU优化了吗?
答:是的,diocp的工作线程是根据cpu核心数进行创建的,在开启服务时为工作线程,优先使用cpu的核。
6,DIOCP像Indy服务器那样实现了各类协议的服务器吗?比如HTTP、FTP等?
答:没有,DIOCP仅仅实现了最底层的通讯服务,并没有像Indy服务器那样实现了HTTP、FTP等。这些HTTP、FTP是通讯协议,如果需要,可以遵照这些协议实现它们。
7,DIOCP服务器有心跳检测功能吗?
答:DIOCP有,但是DIOCP3默认是关闭状态,也就是说不对客户端做心跳包检测,为什么这样做,因为客户端可能是不同语言开发的,很可能有的客户端对服务器主动心跳检测不回应,如果DIOCP服务器主动心跳检测,那么可能会画蛇添足了,所以DIOCP把心跳检测留给用户自己实现了。关于DIOCP心跳,作者写了一篇文章:http://www.diocp.org/?p=189
8,如果更好实现DIOCP的心跳检测?
答:最好是客户端主动发送心跳包给服务器,同时服务器定时对每个socket做连接超时检测。
A,客户端主动发送心跳包给服务器:客户端定时(不要超过服务器端允许的最大等待时间)给服务器发送心跳包,服务器端接收到心跳包时候,更新当前socekt的心跳包 检测时间,便于服务器端进行连接超时检测。
B,服务器定时对每个socket做连接超时检测:服务器定时对每个连接socekt的心跳包时间进行判断,判断最后检测到心跳包时间是否超过了允许的最大时间,如果超过,则 主动端口这个socket。
9,DIOCP不能满足我需求,我应该怎么扩展它呢?
答:当DIOCP不能满足需求时候,我们可以采用继承已有类的方式扩展,这种方式目前我认为是比较好的方式,如果DIOCP保持已经发布功能稳定的前提下,不会影响到 DIOCP的升级。DIOCP服务器中两个类和客户关系最密切,扩展时候应该首先关注这两个类:TIocpTcpServer和TIocpClientContext。
TIocpTcpServer:是DIOCP实现的IOCP服务器的管理类,它负责IOCP的创建和服务等具体工作,我们要使用DIOCP,第一个要使用的类就是它。如果想扩展DIOCP,我们应该认真看一下这个类,是否需要扩展它。
TIocpClientContext,对客户端socekt封装的类,实现了很多功能。如果我们想扩展DIOCP,很可能需要扩展这个类,如果真的扩展这个类,那么在DIOCP服务器创建时候,一定要注意使用registerContextClass去注册这个类,参数就是我们扩展了的TIocpClientContext类,这样在TIocpTcpServer接收到客户端之后,加入到管理列表中的类都是我们扩展的类了。这样做之后,我们在DIOCP服务器里面编写代码时候,是否可以啊?肯定可以的,DIOCP很多参数都是使用TIocpClientContext,实际上这是父类,我们编写的类是子类,允许向上转型,我们无需担心不能使用自己扩展的类,放心扩展使用吧!
10,我的业务逻辑代码应该在哪里实现?
答:我们看DIOCP的ECHO服务器的例子,在“OnRecvBuffer”里面接收客户端数据,我们要知道DIOCP是阻塞式socekt,这意味着,如果当前这个socekt的任务没有处理完毕,客户端将一直等待下去,这也会占用一个服务器端线程,降低处理速度。如果是非常简单的任务,可以直接在这里处理,如果复杂业务,那么我觉得不应该在这里处理了,目前DIOCP提供了IocpTask,我们应该使用这个技术来对逻辑业务处理。DIOCP作者对IocpTask做了介绍:http://www.diocp.org/?p=22
11,DIOCP例子都是什么内容?
答:DIOCP作者对Demo做了详细描述:http://www.diocp.org/?p=202
DIOCP (一) DIOCP常见问题。的更多相关文章
- VS2013使用rtklib中需要注意的一些问题(编译)
最近因为项目需要需要对rtcm数据进行解码,rtklib提供了很多底层的函数,准备直接输出标准DLL的方式供C#调用.下面把项目中引用rtklib源码需要注意的地方记录下. 1. 首先在vs2013中 ...
- YxdIocp包含有支持大并发的TCP服务组件、HTTP服务组件、UDP服务组件、WebSocket服务组件
Delphi Windows IOCP 通讯模型封装,基于DIOCP.YxdIocp包含有支持大并发的TCP服务组件.HTTP服务组件.UDP服务组件.WebSocket服务组件,和TCP.UDP等基 ...
- DIOCP之DEMO-Echo卡死问题分析
最近很多新朋友在调试echo这个例程时发现,总是卡死客户端或服务器端,这是因为客户端的接收数据用的memo没有处理接受到的行数,导致超过最大行数,而卡死界面,只需要如下操作就可以解决: 引用弦子的:虽 ...
- DIOCP单元文件应用场景
diocp.coder.tcpServer是用来做文件传输的 diocp.tcp.server这个是用来做通讯的
- DIOCP之开发流程图之Client
本次分析开发流程图采用的是DIOCP群里的群友[彩蛋]所给的DEMO,依然是win7的画图作品. 本人分析认为:学习网络开发不同本地开发,首先你应该知道完整的开发流程即网络程序运行的先后顺序,有个整体 ...
- DIOCP 运作核心探密
来自网友天地弦的DIOCP早已经广为人知了,有很多的同学都用上了它,甚至各种变异.修改版本也出了不少.我最近也在学习DIOCP,打算将它用于自己的服务端,今天让我们来一起探密它(DIOCP)的运作核心 ...
- DIOCP之注册编码解码器与ClientContext
FTcpServer.registerCoderClass(TIOCPStreamDecoder, TIOCPStreamEncoder);//注册编码器与解码器 FTcpServer.registe ...
- DIOCP之DEMO-登陆验证设计(二)
ECHOServer代码(不考虑粘包的处理): unit ufrmMain; interface uses Windows, Messages, SysUtils, Variants, Classes ...
- DIOCP网络通讯流程
DIOCP 运作核心探密 原文连接: http://blog.qdac.cc/?p=2362 原作者: BB 天地弦的DIOCP早已经广为人知了,有很多的同学都用上了它,甚至各种变异.修改版本也出 ...
随机推荐
- sublime +react+es6开发环境
Babel Sublime3才有的插件,支持ES6.JSX语法高亮. 菜单->View->Syntax->Open all with current extension as...- ...
- Android开发实战之拥有Material Design风格的折叠布局
关于折叠布局,也许你并不陌生,最新版的陌陌,或者一些其他的社交APP都有一个折叠布局.折叠布局,让我们的APP更加具有交互性,同时也更加美观,先来展示一下效果图: 这是我个人做的一个APP主界面,可以 ...
- Activiti操作数据库中文乱码
不要忘了修改数据库表的编码格式,除了数据库的编码格式要修改之外,数据库表的编码格式也要修改,修改为:
- 【codeforces 1025E】Colored Cubes 【构造】
题意 有一个n*n的棋盘和m个棋子,每个棋子有一个初始位置和一个目标位置,每次移动只能选择一个棋子移动到他相邻的格子,并且花费一秒钟.请你找出一个移动的方法,使得在10800步内将所有棋子移动到目标位 ...
- ios7 适配
1.状态栏20px高度问题 ) { [application setStatusBarStyle:UIStatusBarStyleLightContent]; self.window.clipsToB ...
- Win10 提升系统响应速度
转载百度经验: https://jingyan.baidu.com/article/54b6b9c0e9d61e2d583b4719.html 1.鼠标左键点击开始按钮,然后点击菜单中的设置,进入设置 ...
- 91. Decode Ways反编译字符串
[抄题]: A message containing letters from A-Z is being encoded to numbers using the following mapping: ...
- Python使用struct处理二进制(pack和unpack用法)
转载自:http://www.cnblogs.com/gala/archive/2011/09/22/2184801.html 这篇文章写的很好,所以无耻的转了.. 有的时候需要用python处理二进 ...
- ssdb的高可用,源码分析
ssdb,一个高性能的支持丰富数据结构的 NoSQL 数据库, 用于替代 Redis.——这是其官网的自我介绍. ssdb在leveldb存储库的基础上进行改造和丰富,添加了类似redis操作的接口, ...
- java基础知识汇总(持续更新中....)
1.java四大特性:抽象.继承.封装,多态 构造函数: http://blog.csdn.net/qq_33642117/article/details/51909346 2.java数据基本类型: ...