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();
}
}