2011-09-21 15 views
5

Quello che voglio è semplice - Esempio di codice per la creazione di un nuovo socket C++/CLI .Net dalla presa boost asio. Come creare una cosa del genere?come trasformare boost :: socket asio in socket C++/CLI .Net?

Ecco pseudo-codice di quello che vorrei fare:

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

BTW: Ecco come turn C++/CLI .Net socket into boost::asio socket.

+0

Non un'opzione, il costruttore che accetta un handle di socket (spostato) è privato. –

+2

@HansPassant: Sì, ma [questo] (http://msdn.microsoft.com/en-us/library/ms145125.aspx) è pubblico. Attenzione: batterie non incluse. –

risposta

8

Non è possibile una presa Boost.ASIO 'distacco'. È possibile utilizzare la funzione membro native_handle() per ottenere un handle SOCKET dall'oggetto asio::socket, ma è necessario assicurarsi che l'oggetto asio::socket non venga distrutto fino a quando non si è finito con lo SOCKET. Continua a detenere la proprietà del nativo SOCKET e lo chiuderà quando viene chiamato il distruttore.

Come suggerito da André, è possibile duplicare la maniglia del socket. Tuttavia, non prenderei in considerazione la duplicazione di questo socket sicuro, perché Boost.ASIO associa automaticamente l'handle originale SOCKET con una porta di completamento I/O. Se il wrapper .NET Socket o qualche altro codice tenta di associare il socket duplicato a una porta di completamento I/O diversa, si verificherà un errore. So che la classe .NET 2.0 Socket, infatti, associa l'handle SOCKET con una porta di completamento I/O per operazioni asincrone. Questo potrebbe essere cambiato nelle versioni più recenti, tuttavia.

+2

Oppure utilizzare ['WSADuplicateSocket'] (http://msdn.microsoft.com/en-us/library/ms741565 (v = VS.85) .aspx), quindi non importa quando Boost chiude l'handle, avere un handle indipendente per lo stesso socket che lo mantiene aperto. (Supponendo che Boost chiami 'closesocket' e non' shutdown') –

+0

Anche se non riesci a staccare il socket, puoi ancora [duplicare il socket handle] (http://msdn.microsoft.com/en-us/library/ ms741565 (v = VS.85) .aspx) in modo che entrambe le astrazioni possano condividere lo stesso socket tramite due diversi handle. –

+0

L'implementazione Boost associa l'handle SOCKET a una porta di completamento I/O. Non prenderei in considerazione la duplicazione di questo socket sicuro, a meno che tu non sia sicuro al 100% che non ci sia la possibilità che qualche altro codice provi ad associarlo con una seconda porta di completamento I/O; So che la classe 2.0 .NET Socket utilizza internamente un IOCP per operazioni asincrone, anche se potrebbe essere cambiato nelle versioni successive. –

3

probabilmente si può usare la struttura PROTOCOL_INFO restituito da WSADuplicateSocket(), convertirlo alla sua SocketInformation equivalente e quindi utilizzare il appropriate socket constructor per ottenere una presa condivisa con un manico diverso.

La sezione "Osservazioni" nella documentazione su WSADuplicateSocket() rappresenta il flusso di controllo usuale coinvolto nella duplicazione socket. Penso che questo flusso sia in qualche modo equivalente alla coppia di chiamate SocketInformation Socket::DuplicateAndClose() e Socket(SocketInformation).

Problemi correlati