ACE_Svc_Handler

     ACE_Event_Handler: 事件处理器,是ace中所有反应式事件处理器的基类。接口比如Handle_input,Handle_timeout,Handle_signal,Handle_close等。

     ACE_Svc_Handler是ace的同步和反应式数据传输及服务处理机制的基础,ACE_Svc_Handler派生于ACE_Task,而ACE_Task派生于ACE_Event_Handler,所以继承了并发,同步,动态配置和事件处理能力。

#include <ace/Acceptor.h>
#include <ace/Svc_Handler.h>
#include <ace/SOCK_Stream.h>
#include <ace/SOCK_Acceptor.h>

class My_Svc_Handler: public ACE_Svc_Handler<ACE_SOCK_STREAM,ACE_NULL_SYNCH>
{
public:
	int open(void*)
	{
		ACE_INET_Addr raddr;
		peer().get_remote_addr(raddr);
		ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("(%P|%t) connect:%s %d %d\n"),raddr.get_host_addr(),raddr.get_port_number(),this));

		reactor()->register_handler(this,ACE_Event_Handler::READ_MASK);
		return 0;
	}

	int handle_input(ACE_HANDLE fd /* = ACE_INVALID_HANDLE */)
	{
		char buffer[32] = {0};
		int len = peer().recv(buffer,sizeof(buffer)-1);
		if(len > 0)
		{
			if(peer().send_n(buffer,len)<=0)
			{
				ACE_DEBUG ((LM_DEBUG,
					ACE_TEXT ("(%P|%t) %p\n"),
					ACE_TEXT ("send failed")));
				return -1; //must return -1 to call handle_close
			}
			return 0;
		}
		else
			return -1;
	}

	int handle_close(ACE_HANDLE handle, ACE_Reactor_Mask close_mask)
	{
		ACE_INET_Addr raddr;
		peer().get_remote_addr(raddr);
		ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("(%P|%t) close:%s %d\n"),raddr.get_host_addr(),raddr.get_port_number()));
		peer().close();
		return 0;
	}
};

typedef ACE_Acceptor<My_Svc_Handler,ACE_SOCK_ACCEPTOR> MyAcceptor;

int main(int argc, char *argv[])
{
	ACE_INET_Addr addr(12160);
	MyAcceptor server;

	if(server.open(addr) == -1)
	{
		ACE_DEBUG ((LM_DEBUG,
			ACE_TEXT ("(%P|%t) %p\n"),
			ACE_TEXT ("bind failed")));
		return 1;
	}

	while(1)
	{
		ACE_Reactor::instance()->handle_events(); //实现事件分发
	}
	server.close();

	return 0;
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值