2010-01-11 3 views
6

Est-il possible de détacher un socket natif de la classe socket de Boost.ASIO? Si tel est le cas, comment cela peut-il se faire? Je n'arrive pas à trouver quelque chose d'évident dans la documentation. Comme un aperçu rapide de ce que j'essaie d'accomplir: J'ai une classe qui fait une connexion et fait une certaine négociation en utilisant Boost.ASIO, puis repasse un Windows SOCKET natif en cas de succès ou 0 en cas d'échec.Détacher un socket natif de la classe socket de Boost.ASIO

Sauf erreur, le socket natif sera fermé et libéré lorsque mon boost :: asio :: basic_socket sera détruit.

Répondre

2

Répondre à ma propre question.

Windows a une fonction WSADuplicateSocket, qui peut être utilisée pour dupliquer le socket natif. Le socket sous-jacent reste ouvert jusqu'à ce que tous les descripteurs de ce socket soient désalloués.

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

0

Pour Mac OS X, procédez comme suit (pour Linux, il est difficile de ne pas modifier, notez simplement l'idée):

  1. prise envelopper dans un shared_ptr, de sorte qu'il a gagné ne fermez pas en passant dans différentes routines et gardez-le en vie (au moins une référence devrait toujours exister);
  2. Obtenir un descripteur natif avec socket.native();
  3. Retirez-le de kqueue:

    struct kevent event; 
    EV_SET(&event, descriptor, EVFILT_READ, EV_DELETE, 0, 0, 0); //or EVFILT_WRITE 
    
  4. Et faire bloquer si nécessaire:

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

Je sais que pas tout à fait évident, mais le code les éléments de liste suivants ont besoin de 8 espaces indentation - voir [ici] (http://meta.stackexchange.com/questions/24424/list-preceeding-code-prevents-code-f rom-être-affiché-comme-code). –