I have a boost::asio::ip::tcp::socket that I want to write to. Can I
have multiple outstanding async_write() requests for a single socket?
Are the writes performed in the order in which they are submitted? Or
is this undefined behavior?
How about multiple async_read() requests on the same socket?
I know that I need to write to the socket from at most one thread but
that doesn't preclude me from not waiting until the first one is done
to put on the second async write or read.
The reason I ask is because there seems to be two ways to write data
to a socket.
1) The "fire and forget" approach (no queue, simply call async_write()
when you want to write and ignore the completion
handler callback)
2) Push on a queue when you want to write something. Pop from the
queue when the preceeding
async_write() operation completed. Thus at most one
async_write()
operation is
associated with the socket at any point in time.
Thanks in advance,
Kyle
_______________________________________________
Boost-users mailing list
Boost...@lists.boost.org
http://lists.boost.org/mailman/listinfo.cgi/boost-users
Do not do multiple. Make your own simple queue for each connection and be happy.
I'm acquainted with this problem and got quite bad behavior when using
multiple async_write's at once.
Of course, you still can run async_read and async_write together for
one connection.
Of course, you still can run multiple async_read's, async_write's,
when you have multiple connections.
Hope this helps.
BTW, you can find in boost archives two discussions on similar topic.
asio::async_write() is a convenience function that calls
socket::async_write_some() multiple times - until all the data is
sent. This means that if you issue multiple asio::async_write's, the
data will be interleaved in most cases.
As for multiple async_write_some(), it will probably work on some
platforms... But note that async_write_some doesn't promise to send
all your data. So you can't "fire and forget" anyway.
<ATT00001..txt>
So it seems you can not have multiple outstanding async_read_some or async_write_some. This makes since.
async_read() also performs multiple socket::async_read_some()