在没有连接的情况下写入套接字时没有错误

时间:2016-02-04 18:19:20

标签: c++ sockets boost tcp

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

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

由于TCP协议应该发送ACK消息,我相信写连接将检测到连接丢失。

我读了很多关于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:非常欢迎任何关于如何改进我的实施的评论!

1 个答案:

答案 0 :(得分:1)

  

由于TCP协议应该发送ACK消息,我相信写连接将检测到连接丢失。

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

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