xiliang_pan 发表于 2010-12-12 22:05:06

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方法中获取不到对端的地址信息,现在还没有找到原因和解决方法,请高手帮忙分析一下,多谢了。

xiliang_pan 发表于 2010-12-19 22:59:05

都没有遇到过这个问题吗?
自己顶一下

modern 发表于 2010-12-20 09:31:50

把ACE_OS::last_error(),ACE_OS::strerror(ACE_OS::last_error()打印出来的信息贴一下。
另外 log_msg是什么东西?
不要自己声明ACE_Log_Msg的实例,直接用宏或者单件!

freeeyes 发表于 2010-12-20 09:40:47

在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。

modern 发表于 2010-12-21 15:14:52

freeeyes正解
页: [1]
查看完整版本: ACE_Acceptor ACE_TP_Reactor 2