| 137 | } |
| 138 | |
| 139 | bool AsioTransport::is_connected() const { |
| 140 | if (disconnected_ || !socket_.is_open()) { |
| 141 | return false; |
| 142 | } |
| 143 | asio::error_code ec; |
| 144 | const bool prev_nb = socket_.non_blocking(); |
| 145 | socket_.non_blocking(true, ec); |
| 146 | char probe = 0; |
| 147 | const std::size_t n = socket_.receive( |
| 148 | asio::buffer(&probe, 1), asio::socket_base::message_peek, ec); |
| 149 | asio::error_code restore_ec; |
| 150 | socket_.non_blocking(prev_nb, restore_ec); |
| 151 | if (ec == asio::error::would_block) { |
| 152 | return true; // connected, nothing to read yet |
| 153 | } |
| 154 | if (ec || n == 0) { |
| 155 | disconnected_ = true; // EOF/error -> peer gone |
| 156 | return false; |
| 157 | } |
| 158 | return true; // data pending -> connected |
| 159 | } |
| 160 | |
| 161 | void AsioTransport::set_timeout(std::chrono::milliseconds timeout) { |
| 162 | timeout_ = timeout; |