Nie można „odłączyć” gniazdo Boost.ASIO. Możesz użyć funkcji składowej native_handle()
, aby uzyskać uchwyt SOCKET
z obiektu asio::socket
, ale musisz upewnić się, że obiekt asio::socket
nie zostanie zniszczony, dopóki nie skończysz z SOCKET
. Nadal utrzymuje własność natywnego SOCKET
i zamknie ją po wywołaniu destruktora.
Tak jak sugerował André, można powielić uchwyt gniazda. Nie uważam jednak, aby duplikowanie tego gniazda było bezpieczne, ponieważ Boost.ASIO automatycznie kojarzy macierzysty uchwyt SOCKET
z portem zakończenia operacji we/wy. Jeśli opakowanie .NET Socket lub inny kod próbuje skojarzyć zduplikowane gniazdo z innym portem zakończenia operacji wejścia/wyjścia, wystąpi błąd. Wiem, że klasa .NET 2.0 Socket w rzeczywistości kojarzy uchwyt SOCKET
z portem zakończenia wejścia/wyjścia dla operacji asynchronicznych. Mogło to jednak zmienić się w nowszych wersjach.
Nie jest opcją, konstruktor, który bierze (owinięty) uchwyt gniazda jest prywatny. –
@HansPassant: Tak, ale [ten] (http://msdn.microsoft.com/en-us/library/ms145125.aspx) jest publiczny. Ostrzeżenie: baterie nie są dołączone. –