ASIO, как передать сокет от одного исполнителя другому?
Есть asio::basic_socket
, созданный на чужом asio::io_context
, как переместить его к себе, в свой любимый asio::io_context
?
Предусловием является пустота очереди функций завершения у чужого сокета (поскольку функции завершения, явно или неявно, ссылаются на исполнителя, например, как функции сериализованные на strand
).
В документации способа не нашёл. Самопальный код:
template <typename SocketType>
class Foo {
asio::io_context& ioCtx_;
SocketType socket_;
public:
Foo(asio::io_context& ioCtx): ioCtx_(ioCtx), socket_(ioCtx_) {}
std::error_code socket_move_(SocketType &partisan_socket) {
std::error_code ec;
auto protocol = partisan_socket.local_endpoint().protocol();
auto native_handle = partisan_socket.release(ec);
if (!ec) {
socket_.assign(protocol, native_handle, ec);
if (ec) {
#if defined(ASIO_WINDOWS) || defined(__CYGWIN__)
closesocket(native_handle);
#else
close(native_handle);
#endif
}
}
return ec;
}
};
Этот самопал не вызывает удовлетворения, как минимум, он не поддерживает TCPv6.
ОБНОВЛЕНИЕ: после учёта замечаний @user7860670 стал немного лучше, но всё равно вопрос остался.