2011-09-21 22 views
5

Lo que quiero es simple: ejemplo de código de creación de un nuevo socket C++/CLI .Net de socket asio boost. ¿Cómo crear tal cosa?cómo activar boost :: asio socket en C++/CLI .Net socket?

Aquí es pseudo código de lo que me gustaría hacer:

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

Por cierto: Aquí es cómo turn C++/CLI .Net socket into boost::asio socket.

+0

No es una opción, el constructor que toma un (envuelto) identificador de socket es privada. –

+2

@HansPassant: Sí, pero [éste] (http://msdn.microsoft.com/en-us/library/ms145125.aspx) es público. Advertencia: baterías no incluidas. –

Respuesta

8

Usted no puede 'detach' una toma Boost.ASIO. Puede utilizar la función de miembro native_handle() para obtener un identificador SOCKET desde el objeto asio::socket, pero debe asegurarse de que el objeto asio::socket no se destruya hasta que haya terminado con SOCKET. Continúa manteniendo la propiedad del SOCKET nativo y lo cerrará cuando se llame a su destructor.

como André sugirió, se podría duplicar el mango del zócalo. Sin embargo, no consideraría duplicar este socket seguro, porque Boost.ASIO asocia automáticamente el identificador nativo SOCKET con un puerto de E/S de finalización. Si el contenedor .NET Socket u otro código intenta asociar el socket duplicado con un puerto de E/S diferente, se producirá un error. Sé que la clase .NET 2.0 Socket asocia, de hecho, el identificador SOCKET con un puerto de E/S de finalización para operaciones asíncronas. Sin embargo, esto puede haber cambiado en versiones más recientes.

+2

O utilice [ 'WSADuplicateSocket'] (http://msdn.microsoft.com/en-us/library/ms741565 (v = VS.85) .aspx), entonces no importa cuando Boost cierra el mango, se tener un identificador independiente en el mismo socket que lo mantiene abierto. (Suponiendo Boost llama '' closesocket' y no shutdown') –

+0

Incluso si no se puede separar la toma, todavía puede [duplicar el identificador de socket] (http://msdn.microsoft.com/en-us/library/ ms741565 (v = VS.85) .aspx) para que ambas abstracciones puedan compartir el mismo socket a través de dos controles diferentes. –

+0

La implementación de Boost asocia el controlador SOCKET con un puerto de finalización de E/S. No consideraría duplicar este socket como seguro, a menos que esté 100% seguro de que no hay posibilidad de que otro código intente asociarlo con un segundo puerto de E/S de finalización; Sé que la clase 2.0 .NET Socket utiliza internamente un IOCP para operaciones asincrónicas, aunque eso puede haber cambiado en versiones posteriores. –

3

es probable que pueda utilizar la estructura PROTOCOL_INFO devuelto por WSADuplicateSocket(), convertirlo a su equivalente SocketInformation y luego usar el appropriate socket constructor para obtener una toma compartida con un mango diferente.

La sección "Comentarios" en la documentación de WSADuplicateSocket() representa el flujo de control habitual que participan en la duplicación de socket. Creo que este flujo es algo equivalente al SocketInformation Socket::DuplicateAndClose() y Socket(SocketInformation) pares de llamadas.

Cuestiones relacionadas