ACE_Acceptor ACE_TP_Reactor 2
通过ACE_Acceptor创建对象如下:ACE_Acceptor<CServer_Acceptor,ACE_SOCK_ACCEPTOR> acceptor;CServer_Acceptor 为自己定义的类
class CServer_Acceptor: public ACE_Svc_Handler<ACE_SOCK_STREAM,ACE_MT_SYNCH>
{
public:
CServer_Acceptor();
~CServer_Acceptor();
virtual int handle_input(ACE_HANDLE fd = ACE_INVALID_HANDLE);
virtual int handle_close(ACE_HANDLE /* = ACE_INVALID_HANDLE */, ACE_Reactor_Mask /* = ACE_Event_Handler::ALL_EVENTS_MASK */);
static long m_lCount;
long m_lNum;
};
int CServer_Acceptor::handle_input(ACE_HANDLE fd)
{
ACE_INET_Addr addr;
if(-1 == this->peer().get_remote_addr(addr))
{
log_msg(OPINFO_ALL,"获取客户端IP失败[%d:%s]",ACE_OS::last_error(),ACE_OS::strerror(ACE_OS::last_error()));
return 0;
}
log_msg(OPINFO_ALL,"与客户机[%s:%d]建立连接",addr.get_host_addr(),addr.get_port_number());
this->peer().close();
return 0;
}
当存在并发,并且连接频繁时,handle_input方法中获取不到对端的地址信息,现在还没有找到原因和解决方法,请高手帮忙分析一下,多谢了。 都没有遇到过这个问题吗?
自己顶一下 把ACE_OS::last_error(),ACE_OS::strerror(ACE_OS::last_error()打印出来的信息贴一下。
另外 log_msg是什么东西?
不要自己声明ACE_Log_Msg的实例,直接用宏或者单件! 在Open方法中获得链接地址。
//获得远程链接地址和端口
if(this->peer().get_remote_addr(m_addrRemote) == -1)
{
OUR_DEBUG((LM_ERROR, "this->peer().get_remote_addr error.\n"));
sprintf_safe(m_szError, MAX_BUFF_500, "this->peer().get_remote_addr error.");
return -1;
}
有时候input失败,你先要确定input的时候是否是网络断开,如果网络断开的话,你获得地址自然是无效的,在reactor里面,链路断开也会通知input。 freeeyes正解
页:
[1]