由于开博时这本电子书已经看了不少了,所以就不从新写了。这本电子书总体来说不错,毕竟是马维达的作品,但是有不少错误,而且不是针对入门的,向我这种刚刚转向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