modern 发表于 2009-8-3 15:24:04

successed =1一般是代表从底层收到数据了,
但是也有可能是底层检查到了连接错误或者断开,
提示上层应用需关闭连接。

一般的做法是,如果this->rs_.read返回-1直接关闭连接。
在handle_read_stream中检查如果successed=0 或者byte_transfered =0
关闭连接,并清理资源。

jiamswang 发表于 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);

                }
}

lianqin7 发表于 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 ()这里进行


以上是个人的一点理解,如有错误请多多包含
页: 1 [2]
查看完整版本: 在handle_read_stream 时, 总是返回成功这是为什么(在线等)