【问题标题】:No error while writing in a socket without connection在没有连接的情况下写入套接字时没有错误
【发布时间】:2016-05-14 12:20:06
【问题描述】:

我想我的问题对你们来说很容易,但我找不到对我的问题的明确解释。我必须准确地说我对 c++ 很陌生。

我正在尝试使用 boost::asio 套接字创建一个非常简单的 TCP 客户端。我实际上有一些处理同步调用的东西。但在某些时候,我停止了与服务器的连接(通过关闭我的 wifi),套接字继续写入而没有任何错误

由于 TCP 协议应该发送一个 ACK​​ 消息,我相信我的连接丢失会被 write 调用检测到。

我在每个类似的问题中都阅读了很多关于 keep_alive、本机套接字和异步写入的内容,但似乎没有任何内容可以回答我的具体问题。

这是我尝试编写和检测连接丢失的代码部分。不确定这会有所帮助..

try {
        boost::system::error_code error;
        boost::asio::write(socket_, boost::asio::buffer(message), error);
    }
    catch (std::exception& e)
    {
        ReportError(e.what());try {
    boost::system::error_code error;
    boost::asio::write(socket_, boost::asio::buffer(message), error);
    if (error) {
        is_server_up = false;
    }
}
catch (std::exception& e)
{
    ReportError(e.what());
}
    }

所以我的问题是:

  • 关于如何检测我在广阔的万维网上遗漏的书写错误,有什么简单的解释吗?
  • 我是否使用了来自 boost::asio 的正确函数?

PS:非常欢迎对如何改进我的实现提出任何评论!

【问题讨论】:

  • 数据进入 TCP IP 发送窗口,在端口正式关闭或窗口溢出之前您不会听到抱怨。与此同时,TCP 正在愉快地尝试发送该数据,并将继续尝试直到地狱冻结。据它所知,网络中断是暂时的,下次它会尝试发送数据。
  • 有什么方法可以让地狱真正快速冻结?
  • 并非如此。 TCP旨在发送数据或尝试死亡。您可能需要构建一个保持连接的方案来检测您是否有连接。
  • 很高兴知道。问题是我无权访问服务器实现。那么有没有办法在不更改服务器代码的情况下使用保活功能?
  • 这些 TCP 计时器是系统范围的设置,它们默认为分钟间隔是有原因的,即使这个原因在今天看来不合适。如果网络有一个包含两个拨号调制解调器和一个卫星链路的替代路由,它将使用它来完成您的传输。

标签: c++ sockets boost tcp


【解决方案1】:

由于 TCP 协议应该发送一个 ACK​​ 消息,我相信我的连接丢失会被 write 调用检测到。

是的,会的。但是write 不等待确认,这会使应用程序不必要地变慢。稍后会发现连接丢失,最终读取和写入将失败并出现错误。

如果您在连接断开后至少执行了一次成功的写入操作,则该写入最终将失败。在该故障发生后尝试的每次读取或写入操作都会报告错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 2016-01-25
    • 2017-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多