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