我试图搜索这很多。我是network+tcp-sockets
编程的新手。boost :: asio ::在TCP客户端应用程序中读取需要很长时间才能返回连接丢失
我正在使用TCP sockets
通过网络传输数据。我有一个host app
&一个client app
都使用boost::asio
,两端传递数据写入C++
&。
在client app
中,我使用boost::asio::read
在我的C++客户端应用程序中读取socket
中的一些数据。主机应用程序在另一台机器上运行。
以下是我读取一些数据的代码&尝试确定是否有错误。
boost::system::error_code error_code;
std::size_t data_received = boost::asio::read(socket, boost::asio::buffer(&data_to_read, sizeof(data_to_read)), error_code);
if (error_code == boost::asio::error::eof) {
//ends here if the host app closes the socket
//log error & return
}
if (data_received <= 0) {
//log error & return
}
我收到boost::asio::error::eof
当主机应用程序关闭套接字和它的作品来更新我的UI显示我已经失去了联系。
但是,这里是问题:当network/wifi
在主机应用程序上关闭,然后boost::asio::read
需要很长时间才能返回。有点像2分钟。然后在长时间延迟后我得到一个boost::asio::error::eof
错误。奇怪!我无法承受这种延迟,因为我需要为用户快速更新UI
,因此无法从host app
获取数据。
为什么asio
在网络关闭或连接断开时会快速返回?有没有其他的方式来检测这个或处理这个?
PS:注意boost::asio::read
是一个阻塞调用,但如果它需要时间来恢复,因为我在一个worker thread
这样它不锁我的UI线程。
什么是本地IP?因为如果这是回环,那么它与WiFi无关。回送“始终”工作 – sehe
是@sehe。但是,本地IP是不必要的额外信息。因此,我从我的问题中删除了它 –
由于您没有阻塞UI线程,为什么不让UI线程更新UI并让用户知道无法从主机获取数据?在阻止读取被阻止时,您可以选择做什么。如果您不想阻止此线程,直到可以完成读取或明确失败,请不要进行阻止读取调用。你得到了你所要求的 - 如果你不喜欢它,请寻求别的东西。 –