【发布时间】: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 计时器是系统范围的设置,它们默认为分钟间隔是有原因的,即使这个原因在今天看来不合适。如果网络有一个包含两个拨号调制解调器和一个卫星链路的替代路由,它将使用它来完成您的传输。