ACE学习笔记(一)--I/O事件多路分离

  由于开博时这本电子书已经看了不少了,所以就不从新写了。这本电子书总体来说不错,毕竟是马维达的作品,但是有不少错误,而且不是针对入门的,向我这种刚刚转向C++的,啃起来十分困难。硬着头皮啃吧 

在这本书中,有一段讲I/O事件多路分离的问题的源码,照样敲入后和我想象的结果不一样,源码如下:

下边的程序在VC已经编译通过,用的是ACE5.4,运行该服务时,我通过telnet向该服务端口发字符串 ,为什么改服务没反映?
#include "stdafx.h"
#ifdef _DEBUG
#pragma comment(lib,"ACEd")
#else
#pragma comment(lib,"ACE")
#endif

#include "ace/Reactor.h"
#include "ace/SOCK_Acceptor.h"

#define PORT_NO 19998
typedef ACE_SOCK_Acceptor Acceptor;
class My_Accept_Handler;

class My_Input_Handler: public ACE_Event_Handler
{
public:
My_Input_Handler()
{
ACE_DEBUG((LM_DEBUG,"input_Handler Constructor/n"));
}

int handle_input(ACE_HANDLE handle)
{
//接收数据
    ACE_DEBUG((LM_DEBUG,"hahahahah"));
peer_i().recv_n(data,12,0);
ACE_DEBUG((LM_DEBUG,"%s/n",data));
return 0;
}

ACE_HANDLE get_handle() const
{
return this->peer_i().get_handle();
}
   
//返回指向流的指针
ACE_SOCK_Stream &peer_i()
{
return this->peer;
}
private:
ACE_SOCK_Stream peer;
char data[12];
};

class My_Accept_Handler: public ACE_Event_Handler
{
public:
My_Accept_Handler(ACE_Addr &addr)
{
this->open(addr);
}

//open the peer_acceptor so it starts to "listen" for incoming clients
int open(ACE_Addr &addr)
{
peer_acceptor.open(addr);
return 0;
}

//重载输入方法的句柄
int handle_input(ACE_HANDLE handle)
{
//客户端请求连接服务器
//创建一个handler去管理这个连接
My_Input_Handler *eh = new My_Input_Handler();
//接受连接请求
if(this->peer_acceptor.accept (eh->peer_i(),//stream
0,//remote address
0//timeout
,1)==-1) //重新开始,如果 中断的话
   ACE_DEBUG((LM_DEBUG,"Error in connection/n"));
ACE_DEBUG((LM_DEBUG,"Connection established/n"));

//注册读处理事件handler
ACE_Reactor::instance()->
register_handler(eh,ACE_Event_Handler::READ_MASK);
//如果无新客户端,注销
return -1;

}
//由Reactor来决定底层句柄
ACE_HANDLE get_handle(void) const
{
return this->peer_acceptor.get_handle();
}
private:
Acceptor peer_acceptor;
};

int main(int argc, char* argv[])
{
//配置服务的ACE_INET_Addr
ACE_INET_Addr addr(PORT_NO,"127.0.0.1");
    ACE_DEBUG((LM_DEBUG,"the ip is:%s,the port is: %d/n",addr.get_host_addr(),addr.get_port_number()));
//创建Accept handler自动监听客户端的连接请求
My_Accept_Handler *eh=new My_Accept_Handler(addr);
//注册
ACE_Reactor::instance()->register_handler(eh,ACE_Event_Handler::ACCEPT_MASK);
while(1)
ACE_Reactor::instance()->handle_events();

    return 0;
}

foochow大虾给的建议是while(1) 
  ACE_Reactor::instance()->run_reactor_event_loop(); //这样

null

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值