簡體   English   中英

如何檢查Boost :: asio中是否存在套接字連接?

[英]How to check if a socket connection is live in 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。 有什么方法可以檢查連接嗎?

由於底層套接字接口的限制,無法實現像isConnected這樣的功能來在套接字級別檢查TCP連接狀態。 我想出一個解決方法。

在我的實現中,我在應用程序中緩存了一個連接狀態標志( bool m_IsConnected )。 該標志用於指定連接狀態。 它假定如果套接字沒有錯誤,則表明TCP連接處於活動狀態。

每次使用套接字時,標志都會更新。 如果發送和讀取數據時出錯,則表示連接已斷開。 然后相應地更改標志。 TCP連接是否長時間閑置。 在使用套接字之前,該標志不會反映TCP連接的實際狀態。 例如,套接字空閑了很長時間。 由於網絡狀況不佳,它已斷開連接。 在這種情況下,m_IsConnected仍然為true,因為我們沒有獲得有關斷開連接事件的任何回調。 當嘗試通過此套接字發送數據時,將出現錯誤。 現在我們知道連接已斷開。

這是底層套接字接口的限制(我認為Winsock / Bekerly都適用)。 您可以專門為此目的發明一條消息,如果服務器仍然存在,服務器將對其進行應答。 否則,如果超時,則意味着連接已斷開。

編輯:正如Joachim指出的那樣,嘗試讀取套接字可能是一個更好的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM