首页 文章

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

提问于
浏览
6

我正在使用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(); " doesn't work. When the server socket is closed, the " m_socket.is_open(); ”在客户端仍然返回true . 有没有办法检查连接?

2 回答

  • 0

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

    在我的实现中,我在我的应用程序中缓存连接状态标志( bool m_IsConnected ) . 该标志用于指定连接状态 . 它假定如果套接字没有错误,则TCP连接处于活动状态 .

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

  • 2

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

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

相关问题