使用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了,但是又不知道怎么继承哦?请高手指点! 1、可以通过内存映射文件来做。这几乎是两个进程之间共享数据最快的方式。把数据发到所有的客户,可以采用计数的办法,如有100个客户,就在内存映射文件中,写入100标记,客户端取走一个,减少一个,减少到0,就通知服务器程序完成。
2、两个进程之间,没法直接操作对方的内存,只能用网络链接,进行转发。这就和普通的网络收发方式没有差别了。
希望能有所帮助。
回复 #2 winston 的帖子
我的意思也就是网络转发,你这种我知道的,但是现在问题的关键是:CClientAcceptorr那样声明后,当连接来时,自动生成一CComAHAisServer实例为这个连接服务,但是无法对这块共享打标记。也就是说客户个数无法获得! 不会的。你的服务器端,一定知道有多少用户链接上来。你在CComAHAisServer的open方法中,可以向服务器进行计数操作,进行统计。在close的时候进行减少。 呵呵 这倒是一个办法!那自己写一个msg_queue了,然后通过信号量进行同步,每来一个就+1,在handle_output中进行发送,在发送的时候无法断定哪个连接发送了,哪个没有发送。所以我想充分地利用CComAHAisServer中的ACE_msg_queue,通过继承重写handle_input自己控制CComAHAisServer,当我的转接过来的数据放入每个CComAHAisServer实例的ace_msg_queue.可是我又不知道怎么继承ACE_Acceptor哦。 是啊,可以在OPEN的时候,把它保存到别的地方,当数据来时,把ACE_MSG_BLOCK 传给所有CComAHAisServer实例的ace_msg_queue,这样就可以了 跟ACE_Acceptor有啥关系。你的概念还没搞明白。
判断哪个链接发送有很多办法,比如协议里面表明白,要么根据IP:PORT进行辨别。 呵呵 跟ace_acceptor有关系哦,在handle_input中,生成的CComAHAisServer实例了!刚才我测试竟然发现CComAHAisServer没有调用我写的open方法,调用基类了。 用现成的ACCEPTOR。仔细阅读卷2 这是整个类的声明:
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