我正在使用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。有没有办法检查连接?
答案 0 :(得分:4)
由于底层套接字接口的限制,无法实现像isConnected这样的函数来检查套接字级别的TCP连接状态。我想出了一个解决方法。
在我的实现中,我在应用程序中缓存了一个连接状态标志(bool m_IsConnected
)。该标志用于指定连接状态。它假定如果套接字没有错误,则TCP连接仍然存在。
每次使用套接字时都会更新标志。如果发送和读取数据时出错,则表示连接已断开。然后相应地更改标志。如果TCP连接长时间处于空闲状态。在使用套接字之前,此标志不反映TCP连接的实际状态。例如,套接字空闲很长时间。由于网络不良,它已断开连接。在这种情况下,m_IsConnected仍然是真的,因为我们没有得到关于断开事件的任何回调。当尝试通过此套接字发送数据时,将出现错误。现在我们知道连接断开了。
答案 1 :(得分:0)
这是底层套接字接口的限制(我认为对于Winsock / Bekerly而言)。您可以专门为此目的发明一条消息,如果服务器处于活动状态,则会回答该消息。否则,如果超时,意味着连接已关闭。
编辑:正如Joachim指出的那样,尝试读取套接字可能是更好的方法。