2011-09-21 12 views
5

Czego chcę, to proste - przykładowy kod do tworzenia nowego gniazda C++/CLI .Net z gniazda boost asio. Jak stworzyć coś takiego?jak zmienić gniazdo boost :: asio w gniazdo C++/CLI .Net?

Oto pseudokod, co chciałbym zrobić:

.net::socket a; 
boost::asio::socket b; 
a.assign(b.nativeWin32Socket()); 

BTW: Oto jak turn C++/CLI .Net socket into boost::asio socket.

+0

Nie jest opcją, konstruktor, który bierze (owinięty) uchwyt gniazda jest prywatny. –

+2

@HansPassant: Tak, ale [ten] (http://msdn.microsoft.com/en-us/library/ms145125.aspx) jest publiczny. Ostrzeżenie: baterie nie są dołączone. –

Odpowiedz

8

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.

+2

Lub użyj ['WSADuplicateSocket'] (http://msdn.microsoft.com/en-us/library/ms741565 (v = VS.85) .aspx), to nie ma znaczenia, kiedy Boost zamyka uchwyt, ty mieć niezależny uchwyt do tego samego gniazda, które go utrzymuje. (Zakładając, że Boost wywołuje 'closesocket', a nie' shutdown') –

+0

Nawet jeśli nie możesz odłączyć gniazda, możesz nadal [zduplikować uchwyt gniazda] (http://msdn.microsoft.com/en-us/library/ ms741565 (v = VS.85) .aspx), aby obie abstrakcje mogły współdzielić to samo gniazdo za pomocą dwóch różnych uchwytów. –

+0

Implementacja Boost kojarzy uchwyt SOCKET z portem zakończenia We/Wy. Nie uważam, aby duplikowanie tego gniazda było bezpieczne, chyba że jesteś w 100% pewny, że nie istnieje żaden inny kod próbujący powiązać go z drugim portem zakończenia operacji we/wy; Wiem, że klasa 2.0 .NET Socket używa wewnętrznie IOCP do operacji asynchronicznych, chociaż mogło to ulec zmianie w późniejszych wersjach. –

3

Prawdopodobnie możesz użyć struktury PROTOCOL_INFO zwróconej przez WSADuplicateSocket(), przekształcić ją na jej odpowiednik SocketInformation, a następnie użyć appropriate socket constructor, aby uzyskać wspólne gniazdo z innym uchwytem.

Sekcja "Uwagi" w dokumentacji na stronie WSADuplicateSocket() przedstawia typowy przepływ kontrolny związany z duplikacją gniazda. Myślę, że ten przepływ jest w pewnym stopniu równoznaczny z parą połączeń SocketInformation Socket::DuplicateAndClose() i Socket(SocketInformation).

Powiązane problemy