Thread: [asio-users] Different io_service for TLS handshake and read/write
Brought to you by:
chris_kohlhoff
From: Michi H. <mic...@cr...> - 2018-11-30 01:36:21
Attachments:
smime.p7s
|
I had a look at the answer in this thread: https://sourceforge.net/p/asio/mailman/message/3802402/ My situation is similar, but differs slightly. I have an io_service with a single thread that waits for incoming connections on an acceptor instance. Once the connection is established, I call async_handshake() to establish a TLS connection. This works fine, no problem. However, what I want to do is have the handshake performed by the acceptor thread, but use a different io_service with its own separate thread to perform all the I/O work once the handshake is complete. The motivation is CPU affinity, avoid context switches and locking, and avoid having lots of incoming TLS connections delay the I/O for already-established connections. I can’t work out how to do this. The socket embeds the io_service, the ssl stream embeds the socket, and the async_read()/async_write() methods are on the stream, so I can’t see how I can do the handshake in one thread, and transfer all subsequent I/O activity to a different thread once the handshake is complete. Any suggestions for how to achieve this? |
From: Vinnie F. <vin...@gm...> - 2018-11-30 02:37:34
|
On Thu, Nov 29, 2018 at 5:36 PM Michi Henning via asio-users <asi...@li...> wrote: > However, what I want to do is have the handshake performed by the acceptor thread, > but use a different io_service with its own separate thread to perform all the I/O work After the handshake, submit completion handlers for subsequent operations using bind_handler with the executor of the second io_context. Example: io_context ioc1; tcp::socket sock(ioc1); ... io_context ioc2; sock.async_read_some(buffers, bind_executor(ioc2.get_executor(), [](error_code ec, std::size_t bytes_transferred) { ... } Disclaimer: untested Good luck! |
From: Michi H. <mic...@cr...> - 2018-11-30 05:34:46
Attachments:
smime.p7s
|
Thanks for the suggestion! I'm using boost 1.58, which explains why I never noticed this function __ It looks like this functionality was added in 1.66. I'll see whether I can switch to that. Thanks again, Michi. On 30/11/18, 12:38, "Vinnie Falco" <vin...@gm...> wrote: After the handshake, submit completion handlers for subsequent operations using bind_handler with the executor of the second io_context. Example: io_context ioc1; tcp::socket sock(ioc1); ... io_context ioc2; sock.async_read_some(buffers, bind_executor(ioc2.get_executor(), [](error_code ec, std::size_t bytes_transferred) { ... } Disclaimer: untested Good luck! |