jisuanjixu 发表于 2008-6-6 21:56:36

使用ACE_Msg_Queue

    实例:本地有一个客户端,一个服务端。一个客户端接收远程发送的数据,服务端把客户端接收的数据转发给自己客户端。
问题:服务端与客户端有两种方案:1,通过一数据共享区;2,把数据发送到每一个客户服务的ace_msg_queue。方案1中怎么确定数据全部发送到每个客户?方案2怎么把数据放入ace_msg_queue。
说明:客户服务是在服务端上,每来一个连接将生成一个这个客户端的服务。
我的acceptor是这样的:
typedef ACE_Acceptor < CComAHAisServer, ACE_SOCK_ACCEPTOR > CClientAcceptor;
我想通过继承,重载handle_input以控制生成的CComAHAisServer的实例,然后可以调用putQ了,但是又不知道怎么继承哦?请高手指点!

winston 发表于 2008-6-6 22:05:57

1、可以通过内存映射文件来做。这几乎是两个进程之间共享数据最快的方式。把数据发到所有的客户,可以采用计数的办法,如有100个客户,就在内存映射文件中,写入100标记,客户端取走一个,减少一个,减少到0,就通知服务器程序完成。
2、两个进程之间,没法直接操作对方的内存,只能用网络链接,进行转发。这就和普通的网络收发方式没有差别了。
希望能有所帮助。

jisuanjixu 发表于 2008-6-6 22:10:57

回复 #2 winston 的帖子

我的意思也就是网络转发,你这种我知道的,但是现在问题的关键是:CClientAcceptorr那样声明后,当连接来时,自动生成一CComAHAisServer实例为这个连接服务,但是无法对这块共享打标记。也就是说客户个数无法获得!

winston 发表于 2008-6-6 22:29:09

不会的。你的服务器端,一定知道有多少用户链接上来。你在CComAHAisServer的open方法中,可以向服务器进行计数操作,进行统计。在close的时候进行减少。

jisuanjixu 发表于 2008-6-6 22:37:23

呵呵 这倒是一个办法!那自己写一个msg_queue了,然后通过信号量进行同步,每来一个就+1,在handle_output中进行发送,在发送的时候无法断定哪个连接发送了,哪个没有发送。
       所以我想充分地利用CComAHAisServer中的ACE_msg_queue,通过继承重写handle_input自己控制CComAHAisServer,当我的转接过来的数据放入每个CComAHAisServer实例的ace_msg_queue.可是我又不知道怎么继承ACE_Acceptor哦。

jisuanjixu 发表于 2008-6-6 22:51:21

是啊,可以在OPEN的时候,把它保存到别的地方,当数据来时,把ACE_MSG_BLOCK 传给所有CComAHAisServer实例的ace_msg_queue,这样就可以了

winston 发表于 2008-6-6 22:52:49

跟ACE_Acceptor有啥关系。你的概念还没搞明白。
判断哪个链接发送有很多办法,比如协议里面表明白,要么根据IP:PORT进行辨别。

jisuanjixu 发表于 2008-6-6 23:07:23

呵呵 跟ace_acceptor有关系哦,在handle_input中,生成的CComAHAisServer实例了!刚才我测试竟然发现CComAHAisServer没有调用我写的open方法,调用基类了。

winston 发表于 2008-6-6 23:08:19

用现成的ACCEPTOR。仔细阅读卷2

winston 发表于 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
你太马虎了哦。
页: [1] 2
查看完整版本: 使用ACE_Msg_Queue