找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 6778|回复: 9

ACE_Asynch_Acceptor::accept: no buffer space available问题

[复制链接]
发表于 2008-9-18 23:35:47 | 显示全部楼层 |阅读模式
windows server 2003
ace 5.5
vc++ 2003
在运行examples\APG\Proactor 文件里的HA_Proactive_Status 程序时,出现ACE_Asynch_Acceptor::accept: no buffer space available 错误!!!
其他列子也出现同样的情况。。。郁闷中,
google中也有个类似的情况,可是照那样做也不行,各位有什么高见,
[url=http://groups.google.com/group/comp.soft-sys.ace/browse_frm/thread/25e8f21de162a3e9/21bbed17aeb55607?tvc=1&q=ACE_Asynch_Acceptor%3A%3Aaccept&hl=zh-CN#21bbed17aeb55607]http://groups.google.com/group/comp.soft-sys.ace/browse_frm/thread/25e8f21de162a3e9/21bbed17aeb55607?tvc=1&q=ACE_Asynch_Acceptor%3A%3Aaccept&hl=zh-CN#21bbed17aeb55607[/url]
 楼主| 发表于 2008-9-18 23:35:56 | 显示全部楼层
一般是你投递的未完成的异步操作过多,而且内存太小了,导致缓冲区不够了。这是windows上面比较常见的原因。
 楼主| 发表于 2008-9-18 23:36:04 | 显示全部楼层
怎么限制投递的异步操作的数量和内存呢?

在我的程序中,我继承ACE_Asynch_Acceptor

重载validate_new_collection()

在其中, 对IP进行规则过滤

在ACE_Asynch_Acceptor::make_handler()中进行连接数量进行限制, 如果超过一定数量的客户端连接到服务器,再有客户端进行连接,就直接return NULL, 拒绝连接

不知道是否正确?
 楼主| 发表于 2008-9-18 23:36:17 | 显示全部楼层
一般是你投递的未完成的异步操作过多,而且内存太小了,导致缓冲区不够了。这是windows上面比较常见的原因。
可是我是用的ace附带的例子啊。。。没改什么啊,难道是支持windows 2003 不够?
还是我编译设置有问题?
试过:
#include"ace/config-win32.h"
也试过:
#define ACE_HAS_STANDARD_CPP_LIBRARY 1  
#include"ace/config-win32.h"
 楼主| 发表于 2008-9-18 23:36:30 | 显示全部楼层
还有就是,
在运行examples\APG\Proactor 文件里的HA_Proactive_Status 程序时,大概5-10秒钟左右,就出现ACE_Asynch_Acceptor::accept: no buffer space available 错误!!!期间并没有连接啊,只是纯粹的用作监听,所以说 应该 不存在“是你投递的未完成的异步操作过多,而且内存太小了,导致缓冲区不够了。”这种情况
各位有没有在 windows server 2003\ace 5.5(或其他)\vc++ 2003(或其他) 中,运行examples\APG\Proactor 文件里的HA_Proactive_Status 程序时正常的?
或者在windows server 2003 中使用Proactor 或ACE_Asynch_Acceptor正常的??如有麻烦给个例子,我也运行一下,看是我设置错误,还是怎么搞的,艾,郁闷
 楼主| 发表于 2008-9-18 23:36:41 | 显示全部楼层
这个例子的确有些问题,我的机器跑起来,cpu占用100%。
你看看其它例子,是否ok。
ACE\ACE_wrappers\examples\Reactor\Proactor
 楼主| 发表于 2008-9-18 23:37:05 | 显示全部楼层
accepter.open(ACE_INET_Addr (2222), 0, 1,ACE_DEFAULT_BACKLOG,1,ACE_Proactor::instance());

注意哟,如果你使用了ACE_DEFAULT_BACKLOG,那你就完了。自己看看宏定义:
#define SOMAXCONN       0x7fffffff
#define ACE_DEFAULT_BACKLOG SOMAXCONN
 楼主| 发表于 2008-9-18 23:37:17 | 显示全部楼层
我测试了一下,还真是如此!因为我用Visual Assist,看见的是5,就以为默认的是5了,但我的程序里面,使用的是:ACE_DEFAULT_ASYNCH_BACKLOG或者200,所以一直没发现这个ACE_DEFAULT_BACKLOG定义的问题。这个ACE_DEFAULT_BACKLOG如果没有提前定义,的确会重定义成为0x7fffffff。
但是这个backlog值,在各个系统中是没有确定含义的,不要认为定义了5,就只能连接5个。不是的。在UNIX网络编程里面,有详述。
 楼主| 发表于 2008-9-18 23:37:33 | 显示全部楼层
// For the number of <intial_accepts>.
  if (number_of_initial_accepts == -1)
    number_of_initial_accepts = backlog;

  for (int i = 0; i < number_of_initial_accepts; i++)
    {
      // Initiate accepts.
      if (this->accept (bytes_to_read) == -1)
        {
          ACE_Errno_Guard g (errno);
          ACE_ERROR ((LM_ERROR,
                      ACE_LIB_TEXT ("%p\n"),
                      ACE_LIB_TEXT ("ACE_Asynch_Acceptor::accept")));
          ACE_OS::closesocket (this->listen_handle_);
          this->listen_handle_ = ACE_INVALID_HANDLE;
          return -1;
        }
    }

这个就是问题的原因了
 楼主| 发表于 2008-9-18 23:37:45 | 显示全部楼层
晕倒,我也碰到的这个问题。

APG书上写的也是ACE_DEFAULT_BACKLOG。

看来尽信书不如无书啊~~
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-12-4 16:06 , Processed in 0.014762 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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