我正在使用 Boost::asio 来实现客户端/服务器应用程序。下面的客户端代码用于连接到远程服务器。
try
{
boost::asio::io_service m_io_service;
boost::asio::ip::tcp::socket m_socket(m_io_service);
boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::address::from_string("127.0.0.1"), 17);
m_socket.connect(endpoint);
}
catch (std::exception& e)
{
std::cerr << e.what() << std::endl;
}
在客户端,我想检查连接是否有效。功能 ”m_socket.is_open();
" 不起作用。当服务器套接字关闭时, "m_socket.is_open();
" 在客户端仍然返回 true。有什么方法可以检查连接吗?
由于底层socket接口的限制,没有办法实现像isConnected这样的函数来在socket级别检查TCP连接状态。我想出了一个解决方法。
在我的实现中,我缓存了一个连接状态标志(bool m_IsConnected
)在我的应用程序中。该标志用于指定连接状态。它假设如果套接字没有错误,则 TCP 连接处于活动状态。
每次使用套接字时,该标志都会更新。如果发送和读取数据时出现错误,则表示连接已断开。然后相应地更改标志。如果TCP连接长时间空闲。在使用套接字之前,该标志并不反映 TCP 连接的实际状态。例如,socket长时间处于空闲状态。由于网络不好,导致断线。在这种情况下,m_IsConnected 仍然为 true,因为我们没有收到任何有关断开连接事件的回调。当尝试通过此套接字发送数据时,将会出现错误。现在我们知道连接已断开。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)