找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 10473|回复: 6

proactor 在linux 和 windows 上严重问题

[复制链接]
发表于 2008-9-10 23:05:01 | 显示全部楼层 |阅读模式
1. 使用 ace 5.4.5 的 proactor 框架,在 windows 上工作特别好,但是到了 linux 上, ACE_Service_Handler 的子类 中调用  ACE_Asynch_Write_Stream.write() ,write 调用成功来发送数据,但总是没有触发 handle_write_stream 这个方法,导致数据总是没有发送到对方,导致异步发送数据彻底失败
ace 5.4.5+red fc6
2. 使用 ace 5.5 ,到 windows 上,一启动程序,就进入了死循环,下面代码如下:
//ACE_Asynch_Acceptor<P2P_Tcp_EventHandler>  pAcceptor_;
ACE_INET_Addr listen_addr(port, localtcpip.c_str());
if (0 != pAcceptor_->open (listen_addr,
  0,
  1,
  ACE_DEFAULT_BACKLOG,
  1,     
  ACE_Proactor::instance (),
  1))
  ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("%p\n"),ACE_TEXT ("acceptor open")), 1);
 楼主| 发表于 2008-9-10 23:05:11 | 显示全部楼层
关于Proactor在linux上面的问题,老早就有答案。就是说Proactor在Linux/Unix上面使用,是有条件的,比如要安装AIO的补丁什么的。Proactor在Linux上的兼容性的确不好,因为AIO的实现就没谱,没啥好办法。
解决方案:你用非官方的Proactor实现,据称测试良好。本站有文章,自己搜索查一下。
用Reactor,ACE_Dev_Poll_Reactor也很不错,底层用的是Epoll.

第二个问题没法回答,你给的相关信息太少了。
 楼主| 发表于 2008-9-10 23:05:19 | 显示全部楼层
1. 要结合 ace_proactor 和 ace_reactor ,我们需要冒更大的风险,这个犹豫
2. 目前 ace 的两大分离器(ace_reactor 和ace_proactor) ,ace_proactor 在 linux 上应该
说有很大的问题,这次我们算是服了. ace_reactor 是基本的分离器,性能很差,需要跨平台
并提高性能的话,需要使用各平台的子类,比如 ACE_Dev_Poll_Reactor,WCE_WM_Reactor,等
这样搞得也是麻烦
3. 还有,你说得 aio 补丁问题,我也纳闷,要知道是使用得是 red linx fc 6 ,基本是最新得
linux 了,内核也是 2.6 的晚期版本了,aio 错误也应该更新了

有什么办法可以使用一种分离器,在多个平台稳定运行,性能也不错得啊
发表于 2008-10-30 18:24:48 | 显示全部楼层
应该没有问题,我这边运行很稳定,环境是ACE 5.6.6 Centos 5.2
发表于 2011-12-13 17:12:01 | 显示全部楼层
现在ACE到6.0了,proactor还有问题吗?
发表于 2011-12-14 19:21:28 | 显示全部楼层
回复 5# melz


    linux上面,不推荐使用Proactor.
发表于 2014-2-19 16:51:19 | 显示全部楼层
    第二个问题,ACE6.1.9版本的我也遇到类似问题,大概查了下,是由于位于config-win32-common.h文件中的一个宏定义:
  1. #if !defined (ACE_DEFAULT_BACKLOG)
  2. #  define ACE_DEFAULT_BACKLOG SOMAXCONN
  3. #endif /* ACE_DEFAULT_BACKLOG */
复制代码

    其中SOMAXCONN不再是我们熟悉的5,而是在WinSock2.h中另有新的定义:
  1. /*
  2. * Maximum queue length specifiable by listen.
  3. */
  4. #define SOMAXCONN       0x7fffffff
复制代码

    ACE_Asynch_Acceptor 使用ACE_DEFAULT_BACKLOG做为预发起的接收连接请求个数,现在它变这么大,自然是个死循环了,而且进程内存没耗尽就算不错了。把上面的定义还改为5就没问题了,有时候在想这么浅显的错误,ACE团队也会犯,到底经过出厂测试没有? 可能是软件变得复杂了以后,细节就不好控制了。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-12-4 00:42 , Processed in 0.016586 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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