djoin 发表于 2011-12-21 18:21:17

我下载下来看了,不错啊,感谢共享
不过我改变了通信协议,那么PSClient就不能用了,是不是可以改下,用户改变了通信协议,不影响PSClient的使用啊?

freeeyes 发表于 2011-12-21 18:42:19

PSClient是管理端的接口,如果你改了服务器管理端的数据包格式,那么必须修改PSClient。不过这部分的协议是独立的,不影响框架的使用。

freeeyes 发表于 2011-12-23 10:46:54

在这里强烈感谢ZZZ的大力支持,在0.83版本中测试出了一些重要BUG。
所以赶紧在0.833版本中解决,影响使用的BUG应该在最快速反应并解决。

liuchao412 发表于 2011-12-28 11:30:56

我把程序跑起来后ctrl+c杀掉程序,程序会core,好像是在定时器队列那里释放资源有时候会有点问题

freeeyes 发表于 2011-12-28 13:22:58

在哪个环境下?

iiyyp 发表于 2011-12-28 16:42:00

刚下了份最新的代码看了下, 似乎共享内存这块采用的还是 内存块切片的方法, 这种方法共享内存中的数据想要跨进程访问其实很麻烦, 必须对齐.... 前段时间我写了一个共享内存专用的stl, 叫shm_stl, 从stl上面继承下来的类, 可以在共享内存中存各种类型的数据, 无需去 切内存片, 在共享内存上new 一个类也可以, 只要访问时把段基址重新计算一下就可以了...

iiyyp 发表于 2011-12-28 16:47:36

#else                       
                case Proactor_POSIX:    //这个类的功能是服务于非Windows的默认反应器
                        {
                                ACE_POSIX_Proactor* pPosixProactor = new ACE_POSIX_Proactor();
                                if(NULL == pPosixProactor)
                                {
                                        throw "New ACE_POSIX_Proactor Error.";
                                }

                                m_pProactor = new ACE_Proactor(pWin32Proactor, 1);
                                if(NULL == m_pProactor)
                                {
                                        throw "New m_pProactor Error.";
                                }

                                m_nProactorType = Proactor_POSIX;
                                break;
                        }
#endif
还有 AceProactorManager.cpp 中的这段代码在linux下是根本 就跑不起来的, linux下的ace Proactor是有问题的,可以用另一家公司的TProactor的解决方案, 但是要改很多代码, 我最近也被这个问题折腾了好久.

freeeyes 发表于 2011-12-29 10:09:36

所以我在linux下没用这个模式,用的是epoll。

freeeyes 发表于 2011-12-29 10:10:47

可以共享一下你的shm_stl看看嘛?

denis_lan 发表于 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中更合适些。
以上如果说的不对,请您指正。
页: 10 11 12 13 14 15 16 17 18 19 [20] 21 22 23 24 25 26 27 28 29
查看完整版本: ACE开源服务器研究(SVN和git版本持续更新中)