1

当读取操作处理程序返回错误时,意味着连接断开/失败/关闭?开始另一个异步操作是否有意义?

我的意思是,根据不同的可能错误,判断可能非常复杂。

void ReadHandler(const boost::system::error_code& error, size_t bytes_transferred)
{
   if(!error)
   {
      // OK
   }
   else
   {
      // does it make any sense to continue and start another async operation ?
      // or I have to check the error with error.value() and possibly close
      // the session or stop reading...etc ?
   }

我如何知道连接是否仍然可用?当下面的 TCP 层发生读取错误时,是因为连接真的出了问题吗?

4

2 回答 2

0

理解错误本身可能有一些价值。但另一方面,除非你有一个完整的列表,列出“哪些错误可以继续,哪些不可以”,否则无论如何你最终都会得到一个“最佳猜测”的方法。

几乎可以肯定,有些错误是可以恢复的——暂时没有足够的缓冲区空间来接收数据包,或者类似的。其他错误是永久性的(有人拔掉了网络交换机的电源......)。

解决问题的一种方法是计算连续出现多少错误 - 如果您继续并且没有收到另一个错误,那么很好......如果您收到三个(或五个或十个或 100 个)错误连续退出,因为情况可能没有好转

另一种方法是在给定时间内允许如此多的错误(例如,10 秒内超过 5 个错误,或一分钟内超过 50 个错误,或者任何对您的应用程序有意义的错误)。

第三种方法是询问用户 - 这实际上取决于用户的级别,如果出现“遇到错误 X,您要继续吗?(是)|(否)”类型的问题,他/她会怎么做.

很大一部分问题当然是“你的应用程序在做什么,在错误处理方面‘弄错’的后果是什么?” - 如果不了解更多您的项目,我们无法真正回答这个问题 - 实际上,这可能超出了本网站的指导方针来解决。

于 2013-04-12T14:45:42.157 回答
0

它实际上取决于应用程序,甚至异步操作,当调用处理程序时出现非零错误时您会做什么。在大多数应用程序中,我通常处理boost::asio::error::operation_aborted与其他错误不同的方式,因为这意味着程序正在关闭。根据协议,您可能还希望进行boost::asio::error::eof不同的解释。在没有通知的情况下关闭套接字可能是完全合适的。

于 2013-04-13T15:59:58.650 回答