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中更合适些。
以上如果说的不对,请您指正。