$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
From: chris_at_[hidden]
Date: 2007-08-20 10:19:49
Author: chris_kohlhoff
Date: 2007-08-20 10:19:49 EDT (Mon, 20 Aug 2007)
New Revision: 38789
URL: http://svn.boost.org/trac/boost/changeset/38789
Log:
Use shutdown() for portable graceful connection closure.
Text files modified: 
   trunk/libs/asio/example/http/server/connection.cpp  |     6 ++++++                                  
   trunk/libs/asio/example/http/server2/connection.cpp |    24 +++++++++++++-----------                
   trunk/libs/asio/example/http/server2/connection.hpp |     3 ---                                     
   trunk/libs/asio/example/http/server3/connection.cpp |    24 +++++++++++++-----------                
   trunk/libs/asio/example/http/server3/connection.hpp |     3 ---                                     
   5 files changed, 32 insertions(+), 28 deletions(-)
Modified: trunk/libs/asio/example/http/server/connection.cpp
==============================================================================
--- trunk/libs/asio/example/http/server/connection.cpp	(original)
+++ trunk/libs/asio/example/http/server/connection.cpp	2007-08-20 10:19:49 EDT (Mon, 20 Aug 2007)
@@ -82,6 +82,12 @@
 
 void connection::handle_write(const boost::system::error_code& e)
 {
+  if (!e)
+  {
+    // Initiate graceful connection closure.
+    socket_.shutdown(boost::asio::ip::tcp::socket::shutdown_both);
+  }
+
   if (e != boost::asio::error::operation_aborted)
   {
     connection_manager_.stop(shared_from_this());
Modified: trunk/libs/asio/example/http/server2/connection.cpp
==============================================================================
--- trunk/libs/asio/example/http/server2/connection.cpp	(original)
+++ trunk/libs/asio/example/http/server2/connection.cpp	2007-08-20 10:19:49 EDT (Mon, 20 Aug 2007)
@@ -36,11 +36,6 @@
         boost::asio::placeholders::bytes_transferred));
 }
 
-void connection::stop()
-{
-  socket_.close();
-}
-
 void connection::handle_read(const boost::system::error_code& e,
     std::size_t bytes_transferred)
 {
@@ -72,18 +67,25 @@
             boost::asio::placeholders::bytes_transferred));
     }
   }
-  else if (e != boost::asio::error::operation_aborted)
-  {
-    stop();
-  }
+
+  // If an error occurs then no new asynchronous operations are started. This
+  // means that all shared_ptr references to the connection object will
+  // disappear and the object will be destroyed automatically after this
+  // handler returns. The connection class's destructor closes the socket.
 }
 
 void connection::handle_write(const boost::system::error_code& e)
 {
-  if (e != boost::asio::error::operation_aborted)
+  if (!e)
   {
-    stop();
+    // Initiate graceful connection closure.
+    socket_.shutdown(boost::asio::ip::tcp::socket::shutdown_both);
   }
+
+  // No new asynchronous operations are started. This means that all shared_ptr
+  // references to the connection object will disappear and the object will be
+  // destroyed automatically after this handler returns. The connection class's
+  // destructor closes the socket.
 }
 
 } // namespace server2
Modified: trunk/libs/asio/example/http/server2/connection.hpp
==============================================================================
--- trunk/libs/asio/example/http/server2/connection.hpp	(original)
+++ trunk/libs/asio/example/http/server2/connection.hpp	2007-08-20 10:19:49 EDT (Mon, 20 Aug 2007)
@@ -40,9 +40,6 @@
   /// Start the first asynchronous operation for the connection.
   void start();
 
-  /// Stop all asynchronous operations associated with the connection.
-  void stop();
-
 private:
   /// Handle completion of a read operation.
   void handle_read(const boost::system::error_code& e,
Modified: trunk/libs/asio/example/http/server3/connection.cpp
==============================================================================
--- trunk/libs/asio/example/http/server3/connection.cpp	(original)
+++ trunk/libs/asio/example/http/server3/connection.cpp	2007-08-20 10:19:49 EDT (Mon, 20 Aug 2007)
@@ -38,11 +38,6 @@
           boost::asio::placeholders::bytes_transferred)));
 }
 
-void connection::stop()
-{
-  socket_.close();
-}
-
 void connection::handle_read(const boost::system::error_code& e,
     std::size_t bytes_transferred)
 {
@@ -77,18 +72,25 @@
               boost::asio::placeholders::bytes_transferred)));
     }
   }
-  else if (e != boost::asio::error::operation_aborted)
-  {
-    stop();
-  }
+
+  // If an error occurs then no new asynchronous operations are started. This
+  // means that all shared_ptr references to the connection object will
+  // disappear and the object will be destroyed automatically after this
+  // handler returns. The connection class's destructor closes the socket.
 }
 
 void connection::handle_write(const boost::system::error_code& e)
 {
-  if (e != boost::asio::error::operation_aborted)
+  if (!e)
   {
-    stop();
+    // Initiate graceful connection closure.
+    socket_.shutdown(boost::asio::ip::tcp::socket::shutdown_both);
   }
+
+  // No new asynchronous operations are started. This means that all shared_ptr
+  // references to the connection object will disappear and the object will be
+  // destroyed automatically after this handler returns. The connection class's
+  // destructor closes the socket.
 }
 
 } // namespace server3
Modified: trunk/libs/asio/example/http/server3/connection.hpp
==============================================================================
--- trunk/libs/asio/example/http/server3/connection.hpp	(original)
+++ trunk/libs/asio/example/http/server3/connection.hpp	2007-08-20 10:19:49 EDT (Mon, 20 Aug 2007)
@@ -40,9 +40,6 @@
   /// Start the first asynchronous operation for the connection.
   void start();
 
-  /// Stop all asynchronous operations associated with the connection.
-  void stop();
-
 private:
   /// Handle completion of a read operation.
   void handle_read(const boost::system::error_code& e,