Prevent exceptions when closing sockets.

This commit is contained in:
lotodore
2009-08-17 10:11:51 +00:00
parent e420cae48c
commit 6eb25757bc
4 changed files with 15 additions and 8 deletions
+8 -4
View File
@@ -130,7 +130,8 @@ ChatCleanerManager::HandleConnect(const boost::system::error_code& ec,
if (endpoint_iterator != boost::asio::ip::tcp::resolver::iterator()) if (endpoint_iterator != boost::asio::ip::tcp::resolver::iterator())
{ {
// Try next resolve entry. // Try next resolve entry.
m_socket->close(); boost::system::error_code ec;
m_socket->close(ec);
boost::asio::ip::tcp::endpoint endpoint = *endpoint_iterator; boost::asio::ip::tcp::endpoint endpoint = *endpoint_iterator;
m_socket->async_connect( m_socket->async_connect(
endpoint, endpoint,
@@ -151,7 +152,8 @@ ChatCleanerManager::HandleWrite(const boost::system::error_code &ec,
if (ec && ec != boost::asio::error::operation_aborted) if (ec && ec != boost::asio::error::operation_aborted)
{ {
LOG_ERROR("Error sending message to chat cleaner."); LOG_ERROR("Error sending message to chat cleaner.");
m_socket->close(); boost::system::error_code ec;
m_socket->close(ec);
m_connected = false; m_connected = false;
} }
} }
@@ -199,14 +201,16 @@ ChatCleanerManager::HandleRead(const boost::system::error_code &ec, size_t bytes
} }
else else
{ {
m_socket->close(); boost::system::error_code ec;
m_socket->close(ec);
m_connected = false; m_connected = false;
} }
} }
else if (ec != boost::asio::error::operation_aborted) else if (ec != boost::asio::error::operation_aborted)
{ {
LOG_ERROR("Error receiving data from chat cleaner."); LOG_ERROR("Error receiving data from chat cleaner.");
m_socket->close(); boost::system::error_code ec;
m_socket->close(ec);
m_connected = false; m_connected = false;
} }
} }
+4 -2
View File
@@ -617,7 +617,8 @@ ClientStateStartConnect::HandleConnect(const boost::system::error_code& ec, boos
{ {
// Try next resolve entry. // Try next resolve entry.
ClientContext &context = client->GetContext(); ClientContext &context = client->GetContext();
context.GetSessionData()->GetAsioSocket()->close(); boost::system::error_code ec;
context.GetSessionData()->GetAsioSocket()->close(ec);
boost::asio::ip::tcp::endpoint endpoint = *endpoint_iterator; boost::asio::ip::tcp::endpoint endpoint = *endpoint_iterator;
context.GetSessionData()->GetAsioSocket()->async_connect( context.GetSessionData()->GetAsioSocket()->async_connect(
endpoint, endpoint,
@@ -640,7 +641,8 @@ ClientStateStartConnect::TimerTimeout(const boost::system::error_code& ec, boost
{ {
if (!ec && &client->GetState() == this) if (!ec && &client->GetState() == this)
{ {
client->GetContext().GetSessionData()->GetAsioSocket()->close(); boost::system::error_code ec;
client->GetContext().GetSessionData()->GetAsioSocket()->close(ec);
throw ClientException(__FILE__, __LINE__, ERR_SOCK_CONNECT_TIMEOUT, 0); throw ClientException(__FILE__, __LINE__, ERR_SOCK_CONNECT_TIMEOUT, 0);
} }
} }
+1 -1
View File
@@ -459,7 +459,7 @@ ClientThread::Main()
} }
// Close the socket. // Close the socket.
boost::system::error_code ec; boost::system::error_code ec;
GetContext().GetSessionData()->GetAsioSocket()->close(); GetContext().GetSessionData()->GetAsioSocket()->close(ec);
// Set a state which does not do anything. // Set a state which does not do anything.
SetState(CLIENT_FINAL_STATE::Instance()); SetState(CLIENT_FINAL_STATE::Instance());
// Cancel timers. // Cancel timers.
+2 -1
View File
@@ -277,9 +277,10 @@ SessionManager::Clear()
SessionMap::iterator i = m_sessionMap.begin(); SessionMap::iterator i = m_sessionMap.begin();
SessionMap::iterator end = m_sessionMap.end(); SessionMap::iterator end = m_sessionMap.end();
boost::system::error_code ec;
while (i != end) while (i != end)
{ {
i->second.sessionData->GetAsioSocket()->close(); i->second.sessionData->GetAsioSocket()->close(ec);
++i; ++i;
} }
m_sessionMap.clear(); m_sessionMap.clear();