找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 7296|回复: 10

使用ACE_Msg_Queue

[复制链接]
发表于 2008-6-6 21:56:36 | 显示全部楼层 |阅读模式
      实例:本地有一个客户端,一个服务端。一个客户端接收远程发送的数据,服务端把客户端接收的数据转发给自己客户端。
问题:服务端与客户端有两种方案:1,通过一数据共享区;2,把数据发送到每一个客户服务的ace_msg_queue。方案1中怎么确定数据全部发送到每个客户?方案2怎么把数据放入ace_msg_queue
说明:客户服务是在服务端上,每来一个连接将生成一个这个客户端的服务。
我的acceptor是这样的:
typedef ACE_Acceptor < CComAHAisServer, ACE_SOCK_ACCEPTOR > CClientAcceptor;
我想通过继承,重载handle_input以控制生成的CComAHAisServer的实例,然后可以调用putQ了,但是又不知道怎么继承哦?请高手指点!
发表于 2008-6-6 22:05:57 | 显示全部楼层
1、可以通过内存映射文件来做。这几乎是两个进程之间共享数据最快的方式。把数据发到所有的客户,可以采用计数的办法,如有100个客户,就在内存映射文件中,写入100标记,客户端取走一个,减少一个,减少到0,就通知服务器程序完成。
2、两个进程之间,没法直接操作对方的内存,只能用网络链接,进行转发。这就和普通的网络收发方式没有差别了。
希望能有所帮助。
 楼主| 发表于 2008-6-6 22:10:57 | 显示全部楼层

回复 #2 winston 的帖子

我的意思也就是网络转发,你这种我知道的,但是现在问题的关键是:CClientAcceptorr那样声明后,当连接来时,自动生成一CComAHAisServer实例为这个连接服务,但是无法对这块共享打标记。也就是说客户个数无法获得!
发表于 2008-6-6 22:29:09 | 显示全部楼层
不会的。你的服务器端,一定知道有多少用户链接上来。你在CComAHAisServer的open方法中,可以向服务器进行计数操作,进行统计。在close的时候进行减少。
 楼主| 发表于 2008-6-6 22:37:23 | 显示全部楼层
呵呵 这倒是一个办法!那自己写一个msg_queue了,然后通过信号量进行同步,每来一个就+1,在handle_output中进行发送,在发送的时候无法断定哪个连接发送了,哪个没有发送。
       所以我想充分地利用CComAHAisServer中的ACE_msg_queue,通过继承重写handle_input自己控制CComAHAisServer,当我的转接过来的数据放入每个CComAHAisServer实例的ace_msg_queue.可是我又不知道怎么继承ACE_Acceptor哦。
 楼主| 发表于 2008-6-6 22:51:21 | 显示全部楼层
是啊,可以在OPEN的时候,把它保存到别的地方,当数据来时,把ACE_MSG_BLOCK 传给所有CComAHAisServer实例的ace_msg_queue,这样就可以了
发表于 2008-6-6 22:52:49 | 显示全部楼层
跟ACE_Acceptor有啥关系。你的概念还没搞明白。
判断哪个链接发送有很多办法,比如协议里面表明白,要么根据IP:PORT进行辨别。
 楼主| 发表于 2008-6-6 23:07:23 | 显示全部楼层
呵呵 跟ace_acceptor有关系哦,在handle_input中,生成的CComAHAisServer实例了!刚才我测试竟然发现CComAHAisServer没有调用我写的open方法,调用基类了。
发表于 2008-6-6 23:08:19 | 显示全部楼层
用现成的ACCEPTOR。仔细阅读卷2
发表于 2008-6-7 10:10:24 | 显示全部楼层
这是整个类的声明:
class CComAHAisServer: public ACE_Svc_Handler < ACE_SOCK_STREAM, ACE_NULL_SYNCH >
{
        typedef ACE_Svc_Handler < ACE_SOCK_STREAM, ACE_NULL_SYNCH > Super;

public:
        CComAHAisServer(void);
public:
        ~CComAHAisServer(void);

        virtual int Open(void * =0);

        virtual int handle_input (ACE_HANDLE fd = ACE_INVALID_HANDLE );

        virtual int handle_output (ACE_HANDLE fd = ACE_INVALID_HANDLE );

        virtual int handle_close (ACE_HANDLE handle, ACE_Reactor_Mask close_mask );

};

Open != open
你太马虎了哦。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-5-9 21:02 , Processed in 0.014367 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表