找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 10021|回复: 5

result.bytes_transferred () == 0连接断开,但之后又有数据来?!

[复制链接]
发表于 2011-5-10 15:44:44 | 显示全部楼层 |阅读模式
  1. void CMyClient::handle_read_stream (const ACE_Asynch_Read_Stream::Result &result)
  2. {
  3.         //开始读操作
  4.         //显示读取的信息
  5.         //        result.message_block ().rd_ptr ()[result.bytes_transferred ()] = '\0';
  6.         if (result.success () && result.bytes_transferred () != 0)
  7.         {
  8.                 int recvlen=result.bytes_transferred();
  9.                 BYTE* recvBuf=(BYTE*)(result.message_block().rd_ptr());
  10.                 pMain->Decomposition(recvBuf,recvlen,partBuf);//44 48分解开来
  11.                 result.message_block ().release();
  12.                 // 如果还存在未读取数据,则继续读取
  13.                 if (this->initiate_read_stream () == -1)
  14.                 {
  15.                         pMain->MyLineAdd_to_list(SYSTEM_ERROR,NULL_INFO,_T("分配读空间失败!"));
  16.                         return;
  17.                 }
  18.         }
  19.         else
  20.         {
  21.                 //不存在,则释放消息块并关闭SOCKET连接
  22.                 /***********************************************/
  23.                 if(result.bytes_transferred () == 0) [b][color=Red]//此处已成立,但之后数据继续来,为什么?[/color][/b]
  24.                         pMain->Process_S_Server_is_closed[color=Red][b]();//这样的结果十分影响我自己的处理[/b][/color]
  25.                 result.message_block ().release ();
  26.                 /***********************************************/
  27. //                 ACE_OS::shutdown(this->handle(), ACE_SHUTDOWN_BOTH);
  28. //                 ACE_OS::closesocket (result.handle());
  29.                 delete this;
  30.         }
  31. }
复制代码
发表于 2011-5-17 19:02:27 | 显示全部楼层
你怎么判断又有数据来的,一般result.bytes_transferred () == 0是网络连接断开
 楼主| 发表于 2011-5-18 11:13:43 | 显示全部楼层
  1.         else
  2.         {
  3.                 if(result.bytes_transferred () == 0)
  4.                 {
  5.                         pMainDlg->Process_Link_like_close(result.handle(),this);
  6.                 }
  7.                 result.message_block ().release ();
  8.                 delete this;
  9.         }
复制代码
上一段代码已经完全确定执行,连delete this都执行了;
但是,原本的连接里,数据依然很正常的来?!
我对接受的数据全部16进制显示,所以我看的见
 楼主| 发表于 2011-5-18 11:22:31 | 显示全部楼层
回复 2# sunlock


    我对接收的数据全部16进制显示,何时来数据、来什么样的数据、从哪来的,都能看出来。

虽然我又做了相关的处理,但指标不治本。

如果你有思想,还请指点一下
发表于 2011-5-23 23:49:29 | 显示全部楼层
但是,原本的连接里,数据依然很正常的来?!
我对接受的数据全部16进制显示,所以我看的见

你对象都删除了,原本的连接是指什么呢?
你是用第三方抓包软件看到的?
 楼主| 发表于 2011-5-25 16:06:03 | 显示全部楼层
你可以做个简单的Proactor服务器试试,使两个客户端软件逻辑通信。要长时间连接、大量数据定时发送、接收,最好在那种网络经常不稳定的环境中。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-12-22 16:15 , Processed in 0.018928 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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