2016-02-04 24 views
0

我想我的问题对你来说很容易,但我找不到明确的解释我的问题。我必须确定我对C++很陌生。在没有连接的套接字中写入时没有错误

我想创建一个非常简单的TCP客户端,使用boost :: asio套接字。我实际上有一些与同步调用工作。但在某些时候,我停止与我的服务器连接(通过关闭我的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()); 
} 
    } 

所以我的问题是:

  • 是否有关于如何检测,我错过了vaste万维网上书写错误的任何简单的解释?
  • 我是否使用boost :: asio的正确函数?

PS:如何提高我的实现任何评论是非常欢迎!

+0

数据进入TCP IP发送窗口,直到端口正式关闭或您填满窗口后才会听到投诉。与此同时,TCP正在愉快地尝试发送该数据,并将继续尝试,直到地狱冻结。众所周知,网络中断是暂时的,下一次尝试数据将被发送。 – user4581301

+0

有什么办法让地狱冻结真的很快呢? –

+0

不是。 TCP被设计为发送数据或死亡尝试。你可能不得不建立一个保持活力的方案来检测你是否有连接。 – user4581301

回答

1

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

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

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

相关问题