diff options
author | Mauro Sardara <msardara@cisco.com> | 2019-03-07 18:34:52 +0100 |
---|---|---|
committer | Mauro Sardara <msardara@cisco.com> | 2019-03-08 09:33:21 +0000 |
commit | 6922da2298b07d797029da4d40368adf12546639 (patch) | |
tree | 12e9c21553c84d4740fe0bb1d5c88c263e50d714 /libtransport/src/hicn/transport/core/tcp_socket_connector.cc | |
parent | b980b4384d610e64e4c8bdd749a6e8fb0ebd5117 (diff) |
[HICN-85] Added state to connectors.
Change-Id: I26d1b37fec4a2482b97a80fa5648f243745908f7
Signed-off-by: Mauro Sardara <msardara@cisco.com>
Diffstat (limited to 'libtransport/src/hicn/transport/core/tcp_socket_connector.cc')
-rw-r--r-- | libtransport/src/hicn/transport/core/tcp_socket_connector.cc | 35 |
1 files changed, 19 insertions, 16 deletions
diff --git a/libtransport/src/hicn/transport/core/tcp_socket_connector.cc b/libtransport/src/hicn/transport/core/tcp_socket_connector.cc index 4c5f90db3..f1fd4bbac 100644 --- a/libtransport/src/hicn/transport/core/tcp_socket_connector.cc +++ b/libtransport/src/hicn/transport/core/tcp_socket_connector.cc @@ -62,10 +62,8 @@ TcpSocketConnector::TcpSocketConnector( resolver_(io_service_), timer_(io_service_), read_msg_(packet_pool_.makePtr(nullptr)), - is_connecting_(false), is_reconnection_(false), data_available_(false), - is_closed_(false), app_name_(app_name) {} TcpSocketConnector::~TcpSocketConnector() {} @@ -74,11 +72,10 @@ void TcpSocketConnector::connect(std::string ip_address, std::string port) { endpoint_iterator_ = resolver_.resolve( {ip_address, port, asio::ip::resolver_query_base::numeric_service}); + state_ = ConnectorState::CONNECTING; doConnect(); } -void TcpSocketConnector::state() { return; } - void TcpSocketConnector::send(const uint8_t *packet, std::size_t len, const PacketSentCallback &packet_sent) { asio::async_write(socket_, asio::buffer(packet, len), @@ -91,7 +88,7 @@ void TcpSocketConnector::send(const Packet::MemBufPtr &packet) { io_service_.post([this, packet]() { bool write_in_progress = !output_buffer_.empty(); output_buffer_.push_back(std::move(packet)); - if (TRANSPORT_EXPECT_FALSE(!is_connecting_)) { + if (TRANSPORT_EXPECT_TRUE(state_ == ConnectorState::CONNECTED)) { if (!write_in_progress) { doWrite(); } @@ -103,11 +100,13 @@ void TcpSocketConnector::send(const Packet::MemBufPtr &packet) { } void TcpSocketConnector::close() { - io_service_.dispatch([this]() { - is_closed_ = true; - socket_.shutdown(asio::ip::tcp::socket::shutdown_type::shutdown_both); - socket_.close(); - }); + if (state_ != ConnectorState::CLOSED) { + state_ = ConnectorState::CLOSED; + if (socket_.is_open()) { + socket_.shutdown(asio::ip::tcp::socket::shutdown_type::shutdown_both); + socket_.close(); + } + } } void TcpSocketConnector::doWrite() { @@ -208,13 +207,15 @@ void TcpSocketConnector::doReadHeader() { } void TcpSocketConnector::tryReconnect() { - if (!is_connecting_ && !is_closed_) { + if (state_ == ConnectorState::CONNECTED) { TRANSPORT_LOGE("Connection lost. Trying to reconnect...\n"); - is_connecting_ = true; + state_ = ConnectorState::CONNECTING; is_reconnection_ = true; io_service_.post([this]() { - socket_.shutdown(asio::ip::tcp::socket::shutdown_type::shutdown_both); - socket_.close(); + if (socket_.is_open()) { + socket_.shutdown(asio::ip::tcp::socket::shutdown_type::shutdown_both); + socket_.close(); + } startConnectionTimer(); doConnect(); }); @@ -226,7 +227,7 @@ void TcpSocketConnector::doConnect() { [this](std::error_code ec, tcp::resolver::iterator) { if (!ec) { timer_.cancel(); - is_connecting_ = false; + state_ = ConnectorState::CONNECTED; asio::ip::tcp::no_delay noDelayOption(true); socket_.set_option(noDelayOption); doReadHeader(); @@ -248,7 +249,9 @@ void TcpSocketConnector::doConnect() { }); } -bool TcpSocketConnector::checkConnected() { return !is_connecting_; } +bool TcpSocketConnector::checkConnected() { + return state_ == ConnectorState::CONNECTED; +} void TcpSocketConnector::enableBurst() { return; } |