如何检查Boost :: asio中的套接字连接是否存在?

时间:2012-03-29 06:48:35

标签: c++ boost boost-asio

我正在使用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。有没有办法检查连接?

2 个答案:

答案 0 :(得分:4)

由于底层套接字接口的限制,无法实现像isConnected这样的函数来检查套接字级别的TCP连接状态。我想出了一个解决方法。

在我的实现中,我在应用程序中缓存了一个连接状态标志(bool m_IsConnected)。该标志用于指定连接状态。它假定如果套接字没有错误,则TCP连接仍然存在。

每次使用套接字时都会更新标志。如果发送和读取数据时出错,则表示连接已断开。然后相应地更改标志。如果TCP连接长时间处于空闲状态。在使用套接字之前,此标志不反映TCP连接的实际状态。例如,套接字空闲很长时间。由于网络不良,它已断开连接。在这种情况下,m_IsConnected仍然是真的,因为我们没有得到关于断开事件的任何回调。当尝试通过此套接字发送数据时,将出现错误。现在我们知道连接断开了。

答案 1 :(得分:0)

这是底层套接字接口的限制(我认为对于Winsock / Bekerly而言)。您可以专门为此目的发明一条消息,如果服务器处于活动状态,则会回答该消息。否则,如果超时,意味着连接已关闭。

编辑:正如Joachim指出的那样,尝试读取套接字可能是更好的方法。

相关问题