找回密码
 用户注册

QQ登录

只需一步,快速开始

楼主: freeeyes

ACE开源服务器研究(SVN和git版本持续更新中)

 火... [复制链接]
发表于 2011-12-21 18:21:17 | 显示全部楼层
我下载下来看了,不错啊,感谢共享
不过我改变了通信协议,那么PSClient就不能用了,是不是可以改下,用户改变了通信协议,不影响PSClient的使用啊?
 楼主| 发表于 2011-12-21 18:42:19 | 显示全部楼层
PSClient是管理端的接口,如果你改了服务器管理端的数据包格式,那么必须修改PSClient。不过这部分的协议是独立的,不影响框架的使用。
 楼主| 发表于 2011-12-23 10:46:54 | 显示全部楼层
在这里强烈感谢ZZZ的大力支持,在0.83版本中测试出了一些重要BUG。
所以赶紧在0.833版本中解决,影响使用的BUG应该在最快速反应并解决。
发表于 2011-12-28 11:30:56 | 显示全部楼层
我把程序跑起来后ctrl+c杀掉程序,程序会core,好像是在定时器队列那里释放资源有时候会有点问题
 楼主| 发表于 2011-12-28 13:22:58 | 显示全部楼层
在哪个环境下?
发表于 2011-12-28 16:42:00 | 显示全部楼层
刚下了份最新的代码看了下, 似乎共享内存这块采用的还是 内存块切片的方法, 这种方法共享内存中的数据想要跨进程访问其实很麻烦, 必须对齐.... 前段时间我写了一个共享内存专用的stl, 叫shm_stl, 从stl上面继承下来的类, 可以在共享内存中存各种类型的数据, 无需去 切内存片, 在共享内存上new 一个类也可以, 只要访问时把段基址重新计算一下就可以了...
发表于 2011-12-28 16:47:36 | 显示全部楼层
#else                       
                case Proactor_POSIX:    //这个类的功能是服务于非Windows的默认反应器
                        {
                                ACE_POSIX_Proactor* pPosixProactor = new ACE_POSIX_Proactor();
                                if(NULL == pPosixProactor)
                                {
                                        throw "[CAceProactor::Init]New ACE_POSIX_Proactor Error.";
                                }

                                m_pProactor = new ACE_Proactor(pWin32Proactor, 1);
                                if(NULL == m_pProactor)
                                {
                                        throw "[CAceProactor::Init]New m_pProactor Error[ACE_POSIX_Proactor].";
                                }

                                m_nProactorType = Proactor_POSIX;
                                break;
                        }
#endif
还有 AceProactorManager.cpp 中的这段代码在linux下是根本 就跑不起来的, linux下的ace Proactor是有问题的,  可以用另一家公司的TProactor的解决方案, 但是要改很多代码, 我最近也被这个问题折腾了好久.
 楼主| 发表于 2011-12-29 10:09:36 | 显示全部楼层
所以我在linux下没用这个模式,用的是epoll。
 楼主| 发表于 2011-12-29 10:10:47 | 显示全部楼层
可以共享一下你的shm_stl看看嘛?
发表于 2012-1-16 15:19:38 | 显示全部楼层
感谢freeeyes,关于Reactor部分我有几点想法不知道是否合适,请您斧正:
1. 用ACE_Strategy_Acceptor是否更好一点,这样可以通过ACE_Creation_Strategy把连接池pool封装进去
2. 对于ConnectHandler.cpp中peer().recv和peer().send的调用用到了ACE_Time_Value nowait(MAX_MSG_PACKETTIMEOUT),而不是0。根据ACE(6.0.0)源码ACE.cpp所写:
ssize_t
ACE::recv (ACE_HANDLE handle,
           void *buf,
           size_t len,
           int flags,
           const ACE_Time_Value *timeout)
{
  if (timeout == 0)
    return ACE_OS::recv (handle, (char *) buf, len, flags);
  else
    {
      int val = 0;
      if (ACE::enter_recv_timedwait (handle, timeout, val) ==-1)
        return -1;
      else
        {
          ssize_t bytes_transferred =
            ACE_OS::recv (handle, (char *) buf, len, flags);
          ACE::restore_non_blocking_mode (handle, val);
          return bytes_transferred;
        }
    }
}
如果timeout != 0,是会进入阻塞的,对于系统来说,是否传0更合适。
3.  CConnectHandler::SendPacket是通过while(true) { ... if(EWOULDBLOCK) ACE_OS::sleep() ... },是否用handle_output更合适些,可以不用在handle_output中实际发送,而是提交发送事件由主动发送模块去发送。
4. pool和manager都做成ACE_Singleton,对于监听多个端口的服务来说,是否把pool和mananger封装到每个端口的service中更合适些。
以上如果说的不对,请您指正。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-12-23 08:35 , Processed in 0.022491 second(s), 4 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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