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早已经广为人知了,有很多的同学都用上了它,甚至各种变异.修改版本也出 ...
随机推荐
- MySQL数据库篇之库的增删改查
主要内容: 一.系统数据库介绍 二.创建数据库 三.数据库增删改查 四.MySQL添加注释 1️⃣ 系统数据库介绍 1.初识sql语句 有了mysql这个数据库软件,就可以将程序员从对数据的管理中解脱 ...
- SpringBoot 项目打war包 tomcat部署
今天看了一下springboot的项目,个人习惯是接触新的语言或框架,首先要做的就是程序员届最常用的“Hello World”,然后进行项目部署,然今天部署却发现一直都是404,查看tomcat的we ...
- 刷题向》关于一道尺取法的神题目(BZOJ4653)(HARD-)(BZOJ 30题纪念)
不得不说,这也许会是一道长期在我的博客里作为“HARD”难度存在的题 这道题能很好的考验选手的思考能力,但本蒟蒻最后还是听了省队爷讲了之后才会...(默默面壁) 题目里,说对于每一个点,是用当前选出的 ...
- java-tip-Collections.synchronized系列生成的容器
这个系列的容器,和Vector或者HashTable之流的差不多, 区别是: Vector和HashTable是在关键方法上加synchronized关键字 而 Collections.synchro ...
- 配置jdk和tomcat的环境变量
一.1,新建变量名:JAVA_HOME,变量值:d:\Program Files\Java\jdk1.7.0 2,打开PATH,添加变量值:%JAVA_HOME%\bin;%JAVA_HOME%\jr ...
- 750. Number Of Corner Rectangles四周是点的矩形个数
[抄题]: Given a grid where each entry is only 0 or 1, find the number of corner rectangles. A corner r ...
- 325. Maximum Size Subarray Sum Equals k 和等于k的最长子数组
[抄题]: Given an array nums and a target value k, find the maximum length of a subarray that sums to k ...
- 二、SQL的生命周期
MySQL的sql语句由客户端发出,经过连接和权限验证后,最终达到服务器端,由服务器分配thread线程处理,之后就是要介绍的具体服务器端的thread线程是怎么处理每条sql语句的.[ 了解thre ...
- jquery简单ajax示例_读取json文件数据
来自于<jquery权威指南> -------------------------------------- 点击button后,获取到json文件数据,显示如下: Json文件: [ { ...
- Django学习笔记:为Model添加Action
|- Django版本:1.8 |- Python版本:3.4 models.py 1 class Story(models.Model): #编辑Story状态 STATUS_CHOICES = ( ...