找回密码
 用户注册

QQ登录

只需一步,快速开始

楼主: 开发者

socket关不掉吗?

[复制链接]
发表于 2007-12-25 19:12:30 | 显示全部楼层
delete pTest的时候,可能是如下因素导致崩溃:
如果connect成功,则如下代码被调用,
  1. void CTestB:pen (ACE_HANDLE h, ACE_Message_Block&)
  2. {
  3.         if (!m_pTestA)
  4.         {
  5.                 delete this;
  6.                 return;
  7.         }
  8.         this->handle (h);
  9.         if (this->m_Reader.open (*this) != 0 || this->m_Writer.open (*this) != 0)
  10.         {
  11.                 delete this;
  12.                 return;
  13.         }
  14.         ACE_NEW_NORETURN (m_pReaderMB, ACE_Message_Block (PACKET_BUFFERSIZE));
  15.         if (m_pTestA)
  16.                 m_pTestA->MethodB();
  17.         PostRead();
  18. }
复制代码

如果你直接删除,系统里面还有注册的异步调用,会调B对象,导致错误。
解决方案,让B对象自己退出,上面调用者要等待。
 楼主| 发表于 2007-12-26 09:52:03 | 显示全部楼层
你是说上面的delete this都要去掉?如何等待?
 楼主| 发表于 2007-12-26 10:44:49 | 显示全部楼层
b对象如何自己退出!?
 楼主| 发表于 2007-12-26 10:53:49 | 显示全部楼层
另外,我的程序总是在一些new或者delete 一个ACE_Message_Block指针的时候挂掉
发表于 2007-12-26 13:25:36 | 显示全部楼层
b对象会自己删除自己,自动退出。但是外面的程序最好等待它,一起退出。
new的时候一般不会出错,delete的时候出错,一般都是被删除的对象还在被操作中导致。
自己仔细查一下你的调用和线程同步处理吧。
 楼主| 发表于 2007-12-27 14:34:10 | 显示全部楼层
谢谢啊!问题解决了,可是随之而来又出现了两个问题,不知道什么原因

一。在压力测试中,有几百个客户端每30秒就去重复的连接服务器,但是在服务器这边发现时间长了,内存就被用光了,可是我在程序中已经将客户端的请求都断开了,连接也关闭了,acceptor也delete了。

二。客户端连接服务器的时候,压力测试中,比如有1000多客户端要去连接服务器,如果服务器死掉了,过一会再将服务器重启,这时在客户端这边维护的一个ACE_Asynch_Connector<...>在connect的时候就有问题了,总也连接不上

知不知道什么原因!!!!!!
 楼主| 发表于 2007-12-27 15:22:52 | 显示全部楼层
这个是第二个问题的错误提示:
ACE_Asynch_Connect::connect:Invalid argument
发表于 2007-12-27 15:51:33 | 显示全部楼层
查看内存状态,用LOG进行记录追踪。
 楼主| 发表于 2007-12-27 16:07:03 | 显示全部楼层
好像内存没涨多少,但是虚拟内存一直在涨,都到2G了
发表于 2007-12-27 16:21:06 | 显示全部楼层
好像是内存泄露,导致资源耗尽所致。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-11-22 14:28 , Processed in 0.022580 second(s), 4 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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