2010-01-11 6 views
6

Ist es möglich, einen nativen Socket aus der Socket-Klasse von Boost.ASIO zu entfernen? Wenn ja, wie kann es gemacht werden? Ich kann nichts Offensichtliches in der Dokumentation finden.Lösen eines nativen Sockets aus der Socket-Klasse von Boost.ASIO

Als einen kurzen Überblick über das, was ich erreichen möchte: Ich habe eine Klasse, die eine Verbindung und einige Verhandlungen mit Boost.ASIO macht, gibt dann eine native Windows Socket bei Erfolg oder 0 bei einem Fehler zurück.

Wenn ich mich nicht irre, wird der native Socket geschlossen und die Zuordnung aufgehoben, wenn mein boost :: asio :: basic_socket zerstört wird.

Antwort

2

Beantworten meiner eigenen Frage.

Windows verfügt über eine WSADuplicateSocket-Funktion, die zum Duplizieren des systemeigenen Sockets verwendet werden kann. Der zugrunde liegende Socket bleibt geöffnet, bis alle Deskriptoren für diesen Socket freigegeben sind.

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

0

Für Mac OS X Gehen Sie wie folgt (für Linux ist es nicht schwer zu ändern, um nur die Idee bemerken):

  1. Wrap Buchse in einem shared_ptr, so dass sie gewonnen Schließen Sie nicht, wenn Sie in verschiedene Routinen gehen und diese am Leben erhalten (mindestens eine Referenz sollte immer existieren);
  2. Holen Sie sich einen nativen Descriptor mit socket.native();
  3. es aus kqueue entfernen:

    struct kevent event; 
    EV_SET(&event, descriptor, EVFILT_READ, EV_DELETE, 0, 0, 0); //or EVFILT_WRITE 
    
  4. Und es machen, wenn nötig blockiert:

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

ich es nicht genau klar, wissen aber Code Folgende Listenelemente benötigen 8 Leerzeichen Einrückung - siehe [hier] (http://meta.stackexchange.com/questions/24424/list-preceeding-code-prevents-code-f ROM wird als Code angezeigt. –