找回密码
 用户注册

QQ登录

只需一步,快速开始

楼主: psycheqiqi

REACTOR模式下一个服务器最多连接多少客户端?

[复制链接]
 楼主| 发表于 2009-9-22 09:44:54 | 显示全部楼层

回复 #10 modern 的帖子

ACE_Dev_Poll_Reactor无法在windows上运行,但改成能在windows上运行的代码,就2、3行而已,顶多加载一个宏定义
我在论坛里看的帖子这么说的

如果不支持的话那么只能改成proactor?
 楼主| 发表于 2009-9-22 10:13:26 | 显示全部楼层

回复 #10 modern 的帖子

UINT ThreadReactor(LPVOID param)
{
    ACE_INET_Addr port_listen(10000);
        ClientAcceptor clientAcceptor;

    ACE_Select_Reactor select_reactor;
  ACE_Reactor reactor(&select_reactor);
    clientAcceptor.reactor(ACE_Reactor::instance(&reactor));

    if(clientAcceptor.open(port_listen) == -1)
        return -1;

    CAceTestDlg *dlg=(CAceTestDlg*)AfxGetApp()->GetMainWnd();
    dlg->MessageBox("服务器已启动");
       
    int result = ACE_Reactor::instance()->run_reactor_event_loop();
    return result;
}


void CAceTestDlg::OnButServer()
{
        // TODO: Add your control notification handler code here
        UpdateData(TRUE);//
        AfxBeginThread(ThreadReactor,NULL);
        UpdateData(FALSE);
}
在线程中初始化 ACE_Select_Reactor select_reactor;时程序运行出错,为什么?
发表于 2009-9-22 10:17:34 | 显示全部楼层
恩,问问题之前看前人的帖子是个好习惯,
不过我认为磨刀不费砍材功,
楼主最好先看看书,不用多,就看C++NPV2第四章就成。
楼主遇到的问题,书上都已经给出明确的解释了。
让我们说也是复制一遍书上的内容。
 楼主| 发表于 2009-9-22 11:16:45 | 显示全部楼层
原帖由 psycheqiqi 于 2009-9-22 10:13 发表
UINT ThreadReactor(LPVOID param)
{
    ACE_INET_Addr port_listen(10000);
        ClientAcceptor clientAcceptor;

    ACE_Select_Reactor select_reactor;
  ACE_Reactor reactor(&select_reactor);
    clientAccep ...

为什么会出错呢,看了书也没找到答案
 楼主| 发表于 2009-9-22 11:37:34 | 显示全部楼层

回复 #14 psycheqiqi 的帖子

找到了。设置Enable Run-Time Type Infomation(RTTI)
 楼主| 发表于 2009-9-22 13:54:53 | 显示全部楼层

回复 #13 modern 的帖子

UINT ThreadReactor(LPVOID param)
{
    ACE_INET_Addr port_listen(10000);
        ClientAcceptor clientAcceptor;

    ACE_Select_Reactor  select_reactor;
    ACE_Reactor reactor(&select_reactor);
        ACE_Reactor::instance(&reactor);

    clientAcceptor.reactor(ACE_Reactor::instance(&reactor));
    if(clientAcceptor.open(port_listen) == -1)
        return -1;

        CAceTestDlg *dlg=(CAceTestDlg*)AfxGetApp()->GetMainWnd();
    dlg->MessageBox("服务器已启动");
       
   reactor.owner(ACE_OS::thr_self());   
    int result = ACE_Reactor::instance()->run_reactor_event_loop();
  
    return result;
}


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

}

void CAceTestDlg::OnButtonClose()
{
        // TODO: Add your control notification handler code here

        ACE_Reactor::instance()->end_reactor_event_loop();
        CAceTestDlg *dlg=(CAceTestDlg*)AfxGetApp()->GetMainWnd();
    dlg->MessageBox("服务器已停止");
}
这是服务器的启动和关闭的代码,
已经解决了连接数的问题,但是我在服务器停止,退出后会出现错误,是不是handle_close()的问题?
找了半天没找到解决办法。
 楼主| 发表于 2009-9-22 14:01:57 | 显示全部楼层

回复 #16 psycheqiqi 的帖子

解决了。唉!!!

select_reactor连接数超过1000后效率要比proactor的差多少?
发表于 2009-9-22 14:30:46 | 显示全部楼层
机制上来说是天差地别,
但是最主要还是看框架的设计,
系统设计做的不好,
用Proactor异或Epoll性能也上不去。

如果考虑到网络并发,一定表用Select_Reactor,
ICOP与Epoll在各自平台上都有非常好的并发性能表现。

另外选择TP_Reactor用好了1000以下性能也不赖。
而且最重要的是都是基于Select函数,跨平台后行为基本上是一致的。
 楼主| 发表于 2009-9-23 09:05:32 | 显示全部楼层

回复 #18 modern 的帖子

我做的都是在windows下的,是不是最好改成Proactor的

做的最多的就是服务器给很多客户端传文件,为什么不能用Select_Reactor,效率很低?
发表于 2009-9-23 10:07:02 | 显示全部楼层
select_reactor在大连接下面效率差,这是公认的事情。
windows下服务器端,首选Proactor框架。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-12-23 14:05 , Processed in 0.017639 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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