2016-08-11 1 views
2

Ich stehe vor dem folgenden Problem. Ich versuche, eine Drittanbieter-Bibliothek mit Boost Asio zu verwenden, und ich muss einige Socket-Deskriptoren injizieren, die von der Bibliothek in der io_service-Ereignisschleife verwendet werden.Asio-Socket zerstören, ohne nativen Handler zu schließen

Der Ansatz, den ich verwende, ist die Erstellung eines boost :: asio :: ip :: tcp :: socket, der den nativen Handler übergibt, den meine Bibliothek bereitstellt.

Problem ist, dass Bibliothek nur kommunizieren würde, ist es nicht in bestimmten Socket-Benachrichtigungen interessiert (was bedeutet, dass Bibliothek den Socket schließen oder zu einem späteren Zeitpunkt wiederverwenden kann). In jedem Fall möchte ich Boost-Sockets aufräumen und sie zerstören, aber ohne den nativen Handler (d. H. Datei-Deskriptor) zu schließen.

Kurz gesagt, gibt es eine Möglichkeit, einen boost :: asio :: ip :: tcp :: socket zu zerstören, ohne den zugrunde liegenden Handler zu schließen? Ich bin mir bewusst, stattdessen posix :: stream_descriptor zu verwenden, aber ich möchte, dass meine Lösung portabel ist.

+0

Haben Sie versucht, einen dummen Socket zu [zuweisen] (http://www.boost.org/doc/libs/1_61_0/doc/html/boost_asio/reference/basic_stream_socket/assign.html), auch wenn es fehlschlägt kann vorher sein wird nicht mehr verfügbar sein ... –

+0

@JeanDavy 'socket.assign (Protokoll, nativ)' hat eine Voraussetzung, dass 'socket' nicht geöffnet ist (siehe [SocketService] (http: //www.boost .org/doc/libs/1_61_0/doc/html/boost_asio/Referenz/SocketService.html)). Wenn diese Vorbedingung nicht erfüllt ist, bleibt der Zustand von "Socket" unverändert. –

Antwort

2

Nein. Es gibt keine Möglichkeit, ip::tcp::socket zu zerstören, ohne den nativen Handler zu schließen. Dies kann nicht portierbar implementiert werden und Asio unterstützt es daher nicht. Vor Windows 8.1 kann der Socket nur dann, wenn ein Socket mit einem E/A-Abschluss-Port verknüpft ist, nur getrennt werden, indem er geschlossen wird. Siehe this Zusammenhang Github Problem, bei dem Chris Kohlhoff auf diese Feature-Anfrage antwortet:

Dies wird nicht unterstützt, da es nicht portabel umgesetzt werden kann. Insbesondere unter Windows ist ein Socket einem E/A-Abschluss-Port zugeordnet und kann nicht getrennt werden.

Wenn Sie nur auf POSIX-basierte Systeme zielen, dann können Sie den Deskriptor stattdessen in eine posix::stream_descriptor stecken? Diese Klasse stellt eine release() Mitgliedsfunktion bereit.


1. Windows-8.1 aktiviert den Completion-Port-Assoziation über FileReplaceCompletionInformation zu entfernen, ohne den Sockel verschließt.

0

aber ich würde meine Lösung mag tragbar sein

Sobald Sie die native Griff berühren, ist das Programm nicht mehr tragbar.

Sobald Sie sich jedoch damit abgefunden haben, können Sie dup() [Unix] oder DuplicateHandle() [Windows] auf dem systemeigenen Handle aufrufen.

+0

Eigentlich beabsichtige ich nicht, das native Handle zu berühren, Asio und die andere Bibliothek verwenden beide die gleichen nativen Handles in Windows und Unix. – sapito

0

Sie können versuchen, switch to posix :: stream_descriptor und verwenden Sie die release Methode.

Verwandte Themen