找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 3971|回复: 4

proactor的address方法

[复制链接]
发表于 2009-10-15 15:16:05 | 显示全部楼层 |阅读模式
我想从服务器端获取连接的客户端的地址,看了很多有一个ADDRESS方法

在HA_Proactive_Service类中重载address方法
virtual void address
  (const ACE_INET_Addr &remote_address, const ACE_INET_Addr &local_address)
{
   cout << remote_address.get_ip_address() << endl;
}
但address方法中的那2个参数怎么设置。服务器端只有一个地址
ACE_INET_Addr listen_addr(3000);
ACE_Asynch_Acceptor<HA_Proactive_Service>aio_acceptor;
if (0 != aio_acceptor.open(listen_addr, 0, 0, 5, 1, 0, 0))

有完整的例子吗?
发表于 2009-10-15 16:36:49 | 显示全部楼层
address是回调函数,这两个参数是由Proactor框架传给你的。
 楼主| 发表于 2009-10-16 09:07:07 | 显示全部楼层

回复 #2 modern 的帖子

但我如何调用address函数,还是系统调用的。还是不明白如何获得客户端的地址

服务器端代码:
HA_Proactive_Service类
        virtual void address
                (const ACE_INET_Addr &remote_address, const ACE_INET_Addr &local_address)
        {
                CPserverDlg *dlg=(CPserverDlg*)AfxGetApp()->GetMainWnd();
                CString str;
                str.Format("地址:%d",remote_address.get_ip_address());
                dlg->MessageBox(str);
//                cout << remote_address.get_ip_address() << endl;

        }
       
        virtual void open (ACE_HANDLE h, ACE_Message_Block&)
        {
//                _cur[num] = this;
//                num++;
                _cur=this;
                List.push_back(_cur);
                this->handle (h) ;
                if (this->writer_.open (*this) != 0 ||this->reader_.open(*this) !=0)
                {
                        ACE_ERROR ((LM_ERROR, ACE_TEXT ("%p\n"),
                                ACE_TEXT ("HA_Proactive_Service open")));
                        delete this;
                        return;
                }
                ACE_Message_Block *mb;
                ACE_NEW_NORETURN(mb,ACE_Message_Block(8102));
               
                if (this->reader_.read(*mb, mb->space ()) != 0)
                {
                        ACE_OS::printf("Begin read fail\n");
                        delete this;
                        mb->release();
                        return;
                }
        return;               

        }
对话框.cpp

UINT ThreadReactor(LPVOID param)
{
    ACE_INET_Addr listen_addr(3000);
        ACE_Asynch_Acceptor<HA_Proactive_Service>aio_acceptor;
        if (0 != aio_acceptor.open(listen_addr, 0, 0, 5, 1, 0, 0))
                ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("%p\n"), ACE_TEXT ("acceptor open")), 1);
        CPserverDlg *dlg=(CPserverDlg*)AfxGetApp()->GetMainWnd();
        dlg->MessageBox("服务器已启动");
    int result = ACE_Proactor::instance ()->proactor_run_event_loop ();
        ACE_DEBUG ((LM_DEBUG, ACE_TEXT("Thread ended\n")));
    return result;
}

void CPserverDlg::OnStart()
{
        // TODO: Add your control notification handler code here
        UpdateData(TRUE);
        AfxBeginThread(ThreadReactor,NULL);
        UpdateData(FALSE);       
}

void CPserverDlg::OnStop()
{
        // TODO: Add your control notification handler code here
    ACE_Proactor::instance()->proactor_end_event_loop();
       
}
发表于 2009-10-16 10:43:48 | 显示全部楼层
addresses()  Hook method to capture the local and remote addresses for the service connection

If the service handler requires either the local or peer addresses on the new connection, it must implement the addresses() hook method to capture them when the connection is established. The ACE Proactor framework calls this method if the pass_address argument to the asynchronous connection factory was 1. This method is more significant on Windows because the connection addresses cannot be obtained any other way when asynchronous connection establishment is used.
发表于 2009-10-16 14:40:58 | 显示全部楼层
系统调用这个,你在里面存储好就成。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-12-23 13:31 , Processed in 0.026206 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表