2010-01-11 7 views
6

¿Es posible desconectar un socket nativo de la clase de socket de Boost.ASIO? Si es así, ¿cómo se puede hacer esto? Parece que no puedo encontrar nada obvio en la documentación.Separación de un socket nativo de la clase de socket de Boost.ASIO

Como resumen rápido de lo que estoy tratando de lograr: Tengo una clase que establece una conexión y realiza algunas negociaciones utilizando Boost.ASIO, luego devuelve un SOCKET nativo de Windows en caso de éxito o 0 en caso de error.

A menos que me equivoque, el socket nativo se cerrará y desasignará cuando mi boost :: asio :: basic_socket se destruya.

Respuesta

2

Respondiendo a mi propia pregunta.

Windows tiene una función WSADuplicateSocket, que se puede utilizar para duplicar el socket nativo. El socket subyacente permanecerá abierto hasta que todos los descriptores para este socket sean desasignados.

http://msdn.microsoft.com/en-us/library/ms741565(VS.85).aspx

0

Para Mac OS X hacer lo siguiente (para Linux no es difícil de modificar, simplemente observe la misma idea):

  1. toma Wrap en un shared_ptr, por lo que ganó no cerrar al pasar a diferentes rutinas y mantenerlo vivo (al menos una referencia siempre debería existir);
  2. Consigue un descriptor nativo con socket.native();
  3. Eliminarlo de kqueue:

    struct kevent event; 
    EV_SET(&event, descriptor, EVFILT_READ, EV_DELETE, 0, 0, 0); //or EVFILT_WRITE 
    
  4. Y que sea el bloqueo si es necesario:

    fcntl(descriptor, F_SETFL, fcntl(descriptor, F_GETFL, 0) & ~O_NONBLOCK); 
    
+0

Sé que no es exactamente obvia pero el código los siguientes elementos de la lista necesitan una sangría de 8 espacios: ver [aquí] (http://meta.stackexchange.com/questions/24424/list-preceeding-code-prevents-code-f rom-siendo-mostrado-como-código). –

Cuestiones relacionadas