但是也有可能是底层检查到了连接错误或者断开,
提示上层应用需关闭连接。
一般的做法是,如果this->rs_.read返回-1直接关闭连接。
在handle_read_stream中检查如果successed=0 或者byte_transfered =0
关闭连接,并清理资源。 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);
}
} 原帖由 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]