Hi,

  I have adapted the chat tutorial example to send messages to a similar (chat tutorial based) server.

  It is currently working fine however due to the async_write(), I can't close the socket until after all the pending data has been processed on the server end.

  I have google and found discussion and mentioned about async_write() completion handler calling socket.close() however, I was not able to find specific detail as to how that is done.

  I want to avoid closing the connection prematurely as it is asynchronous writing.

  My current do_write() looks like this

void DisplayChatClient::do_write(DisplayChatMessage msg)
{
  DLOG(INFO) << "DisplayChatClient::do_write()";
  bool write_in_progress = !write_msgs_.empty();
  write_msgs_.push_back(msg);
  if (!write_in_progress)
  {
  boost::asio::async_write(socket_,
  boost::asio::buffer(write_msgs_.front().data(),
  write_msgs_.front().length()),
  boost::bind(&DisplayChatClient::handle_write, this,
  boost::asio::placeholders::error));
  }
}

void DisplayChatClient::handle_write(const boost::system::error_code& error)
{
  DLOG(INFO) << "DisplayChatClient::handle_write()";
  if (!error)
  {
  write_msgs_.pop_front();
  if (!write_msgs_.empty())
  {
  boost::asio::async_write(socket_,
  boost::asio::buffer(write_msgs_.front().data(),
  write_msgs_.front().length()),
  boost::bind(&DisplayChatClient::handle_write, this,
  boost::asio::placeholders::error));
  }
  }
  else
  {
  do_close();
  }
}

Cheers
--
Nicholas Yue
Graphics - Arnold, Alembic, RenderMan, OpenGL, HDF5
Custom Dev - C++ porting, OSX, Linux, Windows
http://au.linkedin.com/in/nicholasyue
https://vimeo.com/channels/naiadtools