最近弄了弄ace的东西到一个服务器程序上

最近弄了弄ace的东西到一个服务器程序上,之前的服务器的框架式是自己的一套东西,无非就是iocp负责多路接收,收到一个完整的数据包后投递到一个消息队列里,然后有一个线程池,不断的从队列里取出消息进行处理,不过,俺还缺一个好的内存池的东西。

对于这样的一种构架模式,ace在各个环节都提供了很好的的组件供人使用。

比如在多路连接,数据的多路接收,ace有大名鼎鼎的reactor,不过在这里,由于是windows下的一个服务程序,我使用的是proactor,这样实际上就是用的iocp了,在windows下是面对大量的并发连接就是最好的选择了,如果要换到linux下去就换成ACE_Dev_Poll_Reactor了,在liunx下epull模型也是不错的,只是epull也不是纯异步的了,ACE_Dev_Poll_Reactor使用起来感觉没有proactor方便了,还得我自己来读一下。

对读出来的一包数据进行消息打包的时,可以使用ACE_Message_Block了,比较好的一个地方是可以从内存池里分配给ACE_Message_Block使用,而让我觉得不爽的就是ACE_Message_Block的读写指针的位置并不是完全自动的,在调用一些函数,比如rd_ptr()后,要手动来调整读指针的偏移,还在揣测作者这样子做的意图是什么,这个连接有一张图,很清楚地表述了各种指针的位置http://blog.csdn.net/tellyouatruth/article/details/2160287

将一个消息包打包好了,就将他投递到一个队列里去, 大而全的ACE给我们提供了ACE_Message_Queue这个东西供人使用,简单来讲,调用他的enqueue_tail和dequeue_head来入队出队消息报,还有一点要注意,我使用的时候发现ACE_Message_Queue在对消息包得数量控制并不是使用的包得数量,而是消息包得大小,不知道有有没有可控制的方式改变一下这种方式。

实际上,我在投递消息包的时候是向ACE_Task投递的,在ace里有一个主动对象的概念,ACE_Task就是一个主动对象,实际就线程+信号量的模型了,ACE_Task继承于ACE_Task_Base,在ACE_Task_Base这一层里就是对线程的一个封装,类似于JThread,不同之处就是他一个对象里可以创建多个线程,而JThread只能有一个线程,而在ACE_Task这一层就加上了一个ACE_Message_Queue,我们可以在svc里调用getq来阻塞的得到消息包,然后取出来进行处理。

再回过头来说说多路复用,一个连接对应一个ACE_Service_Handler,ACE_Service_Handler的创建和销毁对于使用者是完全透明的,我们只需完成其接口就行了,不过,这个类有些问题啊,有的接口感觉没有实现啊,还没有读完相关代码,这里保留意见,说说act()这个接口把,我使用者这个接口来把ACE_Service_Handler和程序其他部分关联起来,ACE_Service_Handler的act在一个连接被acept的时候被ACE_Asynch_Acceptor调用,这样通过act得到其传下来的一个指针(呵呵,常规做法了)。但是,但是,当ACE_Asynch_Acceptor创建之初,他投递了大约5个acept进去,这五个的act指针默认是0,这样传到ACE_Service_Handler里的也是0了,看了看ACE_Asynch_Acceptor的接口,找的一个accept接口,把这个接口重写了,算是在中间拦截一下,改了传入的act的值,问题解决


大概样子就是这样了,整个路径是通了,目前还有些纠结ACE_Message_Block这一块儿,怎样能构造一个复合消息呢,不继承他再弄一个类得话?


对于ACE_Message_Block,继承之,或在其内记录一些其他的信息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值