找回密码
 用户注册

QQ登录

只需一步,快速开始

楼主: jiamswang

在handle_read_stream 时, 总是返回成功这是为什么(在线等)

[复制链接]
发表于 2009-8-3 15:24:04 | 显示全部楼层
successed =1一般是代表从底层收到数据了,
但是也有可能是底层检查到了连接错误或者断开,
提示上层应用需关闭连接。

一般的做法是,如果this->rs_.read返回-1直接关闭连接。
在handle_read_stream中检查如果successed=0 或者byte_transfered =0
关闭连接,并清理资源。
 楼主| 发表于 2009-8-3 15:38:16 | 显示全部楼层
SOCKET连接应没有关. 在initia_read_stream中, 我有判断.
int
Client::initiate_read_stream (void)
{
        if (this->flg_cancel_ != 0 || this->handle_ == ACE_INVALID_HANDLE)
                return -1;

        ACE_Message_Block *mb = 0;
                ACE_NEW_RETURN (mb,
                        ACE_Message_Block (1024), //BUFSIZ + 1),
                        -1);

                // Inititiate read
                if (this->rs_.read (*mb, mb->size()-1) == -1)
                {
                        mb->release (); 如果失败, 会打下面的
                        // On peer close, ReadFile will yield ERROR_NETNAME_DELETED; won't get
                        // a 0-byte read as we would if underlying calls used WSARecv.
                        if (ACE_OS::last_error () == ERROR_NETNAME_DELETED)
                                ACE_ERROR_RETURN ((LM_DEBUG,
                                ACE_TEXT ("(%t) Server %d, peer closed\n"),
                                this->id_),
                                -1);

                }
}
发表于 2009-8-3 16:38:25 | 显示全部楼层
原帖由 jiamswang 于 2009-8-3 15:38 发表
SOCKET连接应没有关. 在initia_read_stream中, 我有判断.
int
Client::initiate_read_stream (void)
{
        if (this->flg_cancel_ != 0 || this->handle_ == ACE_INVALID_HANDLE)
                return -1;

        ACE_Message_Block *mb ...
如果是对方的SOCKET关闭了,this->rs_.read一般不会返回-1的,而这时successed=1且byte_transfered =0。
所以在handle_read_stream里面加入关闭socket的处理就好了

分析下successed及byte_transfered的几种情况:
1. successed == 0 这时候应该是本机的socket或者IO出了问题,怎么处理自己看着办
2. successed == 1且byte_transfered == 0,这时候应该是对方的socket出了问题,怎么处理自己看着办
3. successed == 1且byte_transfered > 0 ,成功,再次调用initiate_read_stream ,如果对方没再发送数据,程序会在
while(控制条件)
ACE_Proactor::instance ()->handle_events ();
这里阻塞(没有其他回调方法的情况下),设置超时也在ACE_Proactor::instance ()->handle_events ()这里进行


以上是个人的一点理解,如有错误请多多包含
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-11-26 08:05 , Processed in 0.015847 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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