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 стал немного лучше, но всё равно вопрос остался.


Ответы (0 шт):