找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 11200|回复: 26

socket关不掉吗?

[复制链接]
发表于 2007-12-24 17:11:34 | 显示全部楼层 |阅读模式
我在Proactor下继承ACE_Service_Handler写了一个类Test(对象pTest),去连接另外一台机器;当去连接的时候会创建一个Test的实例pTest,可是在这个socket(也就是pTest)主动断开连接的时候,总是会出现程序挂掉的情况,请问有没有知道什么原因的!

是ACE对断开的连接有什么限制吗?
发表于 2007-12-24 23:08:48 | 显示全部楼层
你程序的问题,设置断点追踪一下。
ACE对断开的连接都是可以处理的,问题在于你怎么处理。
 楼主| 发表于 2007-12-25 10:43:53 | 显示全部楼层
我在程序跟踪的过程中,在delete pTest的时候,里面有一个指针总是在delete的时候有问题,好像有越位的情况,是不是程序里面有什么地方指针或者其他的东西使用不当造成的?
发表于 2007-12-25 11:02:57 | 显示全部楼层
这是很常见的C++程序错误,你删除指针指向的对象的时候,这个对象还在被别的线程操作。
应该是典型的同步问题。
 楼主| 发表于 2007-12-25 12:47:03 | 显示全部楼层
所有程序都是在一个Thread里面跑的
发表于 2007-12-25 12:57:50 | 显示全部楼层
那就更好查了。贴上程序,我们帮你分析分析。
 楼主| 发表于 2007-12-25 14:12:58 | 显示全部楼层
外面在使用的时候是
CTestA *pTest = new CTestA();
pTest.Connect();

delete的时候是:
pTest.DisConnect();
delete pTest;//问题就再这里,总是delete的时候错误,甚至导致程序挂掉
pTest = 0;
 楼主| 发表于 2007-12-25 14:13:28 | 显示全部楼层
下面是代码:
  1. CTestA::CTestA()
  2. {
  3.         pSoc                = 0;
  4. }
  5. CTestA::~CTestA()
  6. {
  7.         if (pSoc)
  8.         {
  9.                 delete pSoc;
  10.                 pSoc = 0;
  11.         }
  12. }
  13. bool CTestA::Connect()
  14. {
  15.         ACE_Asynch_Connector<CTestB> vConnector;
  16.         vConnector.open();
  17.         ACE_INET_Addr peer_addr (8000, 192.168.1.10);
  18.         if (vConnector.connect(peer_addr, (const ACE_INET_Addr &)ACE_Addr::sap_any, 1, this) == -1)
  19.         {
  20.                 return false;
  21.         }
  22.         return true;
  23. }
  24. bool CTestA:isConnect()
  25. {
  26.         if (!pSoc)
  27.                 return false;
  28.         if (pSoc->handle() != ACE_INVALID_HANDLE)
  29.                 ACE_OS::closesocket (pSoc->handle());
  30.         if (pSoc)
  31.         {
  32.                 pSoc->m_pTestA = 0;
  33.                 delete pSoc;
  34.                 pSoc = 0;
  35.         }
  36.         return true;
  37. }
  38. void CTestA::MethodA(void* pSocket)
  39. {
  40.         if (!pSocket) return;
  41.         pSoc = (CTestB*) pSocket;
  42.         ACE_OS::memset(cBuffer, 0, 1024);//cBuffer成员变量
  43. }
  44. void CTestA::MethodB()
  45. {
  46.         if (!pSoc) return;
  47.         ACE_CString str = "ddddddddddddddddddd";
  48.         pSoc->ostWrite((char*)str.fast_rep(), str.length());
  49. }
  50. void CTestA::MethodC(char *pContent, int nSize)
  51. {
  52.         //
  53. }
  54. void CTestA::CloseA()
  55. {
  56.         pSoc = 0;
  57. }
  58. CTestB继承ACE_Service_Handler
  59. CTestB::CTestB()
  60. {
  61.         m_pTestA        = 0;
  62.         m_pReaderMB                = 0;
  63. }
  64. CTestB::~CTestB()
  65. {
  66.         if (m_pTestA)
  67.         {
  68.                 m_pTestA->CloseA();
  69.                 m_pTestA = 0;
  70.         }
  71.         if (this->handle() != ACE_INVALID_HANDLE)
  72.                 ACE_OS::closesocket (this->handle());
  73.         if (m_pReaderMB)
  74.         {
  75.                 m_pReaderMB->release();
  76.                 m_pReaderMB = 0;
  77.         }
  78. }
  79. void CTestB::act (const void *pTest)
  80. {
  81.         m_pTestA = (CTestA*)pTest;
  82.         if (m_pTestA)
  83.                 m_pTestA->MethodA(this);
  84. }
  85. void CTestB:pen (ACE_HANDLE h, ACE_Message_Block&)
  86. {
  87.         if (!m_pTestA)
  88.         {
  89.                 delete this;
  90.                 return;
  91.         }
  92.         this->handle (h);
  93.         if (this->m_Reader.open (*this) != 0 || this->m_Writer.open (*this) != 0)
  94.         {
  95.                 delete this;
  96.                 return;
  97.         }
  98.         ACE_NEW_NORETURN (m_pReaderMB, ACE_Message_Block (PACKET_BUFFERSIZE));
  99.         if (m_pTestA)
  100.                 m_pTestA->MethodB();
  101.         PostRead();
  102. }
  103. void CTestB::handle_read_stream(const ACE_Asynch_Read_Stream::Result &result)
  104. {
  105.         if (!result.success () || result.bytes_transferred () == 0)
  106.         {
  107.                 delete this;
  108.                 return;
  109.         }
  110.         ACE_Message_Block &mb = result.message_block();
  111.         if (m_pTestA)
  112.                 m_pTestA->MethodC(mb.rd_ptr(), mb.length());
  113.         PostRead();
  114. }
  115. void CTestB::handle_write_stream(const ACE_Asynch_Write_Stream::Result &result)
  116. {
  117.         result.message_block().release();
  118.         if (!result.success () || result.bytes_transferred () == 0)
  119.         {
  120.                 delete this;
  121.                 return;
  122.         }
  123.         return;
  124. }
  125. void CTestB:ostRead()
  126. {
  127.         if (!m_pReaderMB) return;
  128.         if (this->handle() == ACE_INVALID_HANDLE) return;
  129.         m_pReaderMB->reset();
  130.         if (this->m_Reader.read (*m_pReaderMB, m_pReaderMB->space()) != 0);
  131. }
  132. bool CTestB:ostWrite(char* pBuffer, int nSize)
  133. {
  134.         if (this->handle() == ACE_INVALID_HANDLE) return false;
  135.         ACE_Message_Block* pWriterMB = 0;
  136.         ACE_NEW_RETURN (pWriterMB, ACE_Message_Block (1024), false);
  137.         pWriterMB->copy(pBuffer, nSize);
  138.         if (this->m_Writer.write (*pWriterMB, pWriterMB->length ()) != 0);
  139.         return true;
  140. }
复制代码

[ 本帖最后由 winston 于 2007-12-25 15:16 编辑 ]
发表于 2007-12-25 15:19:36 | 显示全部楼层
pTest.DisConnect(); 怎么写的?

感觉是你的程序退出了,但是还有对象在操作导致。
 楼主| 发表于 2007-12-25 16:48:15 | 显示全部楼层
外面在使用的时候是
CTestA *pTest = new CTestA();
pTest.Connect();

delete的时候是:
pTest.isConnect();//打错了
delete pTest;//问题就再这里,总是delete的时候错误,甚至导致程序挂掉
pTest = 0;
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-12-23 08:44 , Processed in 0.018428 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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