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早已经广为人知了,有很多的同学都用上了它,甚至各种变异.修改版本也出 ...
随机推荐
- Windows安装Mysql5.7.22
1.下载Mysql,5.7版本,将zip包解压到某个安装目录下面,最好不要放C盘,选择一个容量大的磁盘.下载地址:https://dev.mysql.com/downloads/mysql/ 2.进入 ...
- 转载--js对象无法当成参数传递
今天我碰到了这个问题一头雾水,明明记得对象是可以传参的啊.我使用了一款基于bootstrap的表格插件DataTables,想把行信息直接传给操作函数,方便编辑(此行信息是一个对象,按道理可以的啊), ...
- web前端整套面试题(一)--js相关
一.单选 1.以下哪条语句会产生运行:(A) A.var obj = ( ); B.var obj = [ ]; C.var obj = { }; D.var obj = / /; B代表数组,C代表 ...
- solr自动提示 - jquery ui autocomplete
需求: 搜索框中 输入部分关键词之后,有下拉联想提示.选中提示,使用鼠标或者使用enter键,则触发搜索功能.没有选择搜索提示,使用部分输入关键词作为搜索,直接使用enter键也能触发搜索功能.整个过 ...
- Boost智能指针使用总结
内存管理是一个比较繁琐的问题,C++中有两个实现方案: 垃圾回收机制和智能指针.垃圾回收机制因为性能等原因不被C++的大佬们推崇, 而智能指针被认为是解决C++内存问题的最优方案. 1. 智能指针定义 ...
- [C++] the pointer array & the array's pointer
int *p[4]------p是一个指针数组,每一个指向一个int型的int (*q)[4]---------q是一个指针,指向int[4]的数组 --> type: int(*)[4] vo ...
- oracle sql 数结构表id降序
UPDATE BAS_ORGANIZATION_TYPE T1SET T1.PARENTID=(select rn from (SELECT id,rownum rn FROM BAS_ORGANIZ ...
- C#序列化效率对比
原文出处:https://www.cnblogs.com/landeanfen/p/4627383.html 从使用序列化到现在,用到的无非下面几种方式:(1)JavaScriptSerializer ...
- Tag recommendaion... 论文中的小例子,使用HOSVD算法推荐
本文内容来自于论文:Tag recommendations based on tensor dimensioanlity reduction 在社会标签系统中,存在三元关系,用户-物品-标签.这些数据 ...
- [GO]用go语言实现区块链工作原理
基本原理这里就不写了,只写一个简单demo的实现 首先得有一个区块用来存储区块头和区块体 type Block struct { Version int64 PreBlockHash []byte H ...