Verwenden Sie das gleiche udp-socket für async-senden/empfangen
Ich verwenden die gleiche Buchse in meinem udp server, um Daten zu empfangen, die von clients auf irgendeinem port, und später, nach der Bearbeitung von Anfragen zu reagieren, um clients die Verwendung von ip -:: ud::socket ::async_send_to
Erhalten, ist getan async mit async_receive_from auch. Die Buchse verwendet denselben ioService (es ist die gleiche Buchse, nachdem alle)
Die Dokumentation ist nicht eindeutig, wenn man haben kann, in einem Augenblick, in der gleichen udp-socket Datagramme empfangen von client A (bei asynchronen Weg) und möglicherweise senden Sie ein weiteres Datagramm an client B (async gesendet) in der gleichen Zeit
Ich vermute, das könnte zu Problemen führen. Ich landete mit der gleichen Buchse für Antworten, denn ich konnte nicht binden Sie einen anderen socket an den gleichen server-port, während die Beantwortung anderer client.
Wie kann ich binden einen anderen sockel auf demselben server port?
BEARBEITEN. Ich versuche, Sie zu binden, die zweite udp-socket an den gleichen UDP-port mit:
socket(ioService, boost::asio::ip::udp::endpoint(boost::asio::ip::udp::v4(), port))
Wenn ich das erste mal (verbindlich für server "erhalten" - Buchse) ist es OK, aber zu schaffen versuchen einem anderen socket zweiten mal gefällt, meldet es Fehler bei bind (asio wirft exception)
Ist es möglich, binden einen anderen sockel auf demselben server port ? So würde ich verschiedene sockets für senden von replays. Was passiert ist, ist, dass ich denke mein setup server verursachen kann Störung.
Bitte Bearbeiten Sie die Frage zu klären, anstatt das hinzufügen von Kommentaren
Ich nehme an, dass die zentrale Frage hier ist versucht zu binden, mehr als einen socket mit dem gleichen port, das ist einfach nicht möglich und sinnlos.
Es ist tatsächlich möglich, mit UDP über
SO_REUSEADDR
: aber ich Stimme zu, dass es sinnlos ist. OP: die Steckdosen sind voll-duplex ganzen Weg hinunter zu dem Metall: Sie kann Lesen und schreiben gleichzeitig.
InformationsquelleAutor Ghita | 2012-09-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist es möglich einen UDP-socket gleichzeitig empfangen von einem remote-Endpunkt und senden an ein anderes remote-Endpunkt. Jedoch, pro Boost.Asio Threads und zu Steigern.Asio Dokumentation, es ist in der Regel unsicher zu machen, gleichzeitige Anrufe auf einem einzelnen Objekt.
So, das ist sicher:
- und dies ist sicher:
aber dies angegeben ist, als nicht sicher:
Sich bewusst sein, dass einige Funktionen, wie die
boost::asio::async_read
, sind ein komponiert Betrieb, und haben eine zusätzliche thread-Sicherheit Beschränkungen.Wenn eine der folgenden Bedingungen erfüllt sind, dann muss keine weitere Synchronisierung auftreten, da der Strom wird implizit synchron:
io_service::run()
wird nur aufgerufen wird, von einem einzigen thread.async_receive_from
undasync_send_to
werden nur aufgerufen, innerhalb der gleichen Kette von asynchronen Vorgängen. Zum Beispiel, dieReadHandler
übergebenasync_receive_from
ruftasync_send_to
, und dieWriteHandler
übergebenasync_send_to
ruftasync_receive_from
.Auf der anderen Seite, wenn es mehrere threads, die potentiell gleichzeitigen aufrufen an die Steckdose, dann die Synchronisierung muss erfolgen. Betrachten Sie die Synchronisierung entweder durch aufrufen der Funktionen und Prozeduren durch eine boost::asio::io_service::strand, oder mit anderen synchronisationsmechanismen, wie Boost.Thread mutex.
Zusätzlich zur thread-Sicherheit, das management von Objekt-Lebenszeiten betrachtet werden muss. Wenn der server verarbeiten muss mehrere Anforderungen gleichzeitig zu nutzen, dann seien Sie vorsichtig über das Eigentum an der
buffer
undendpoint
für jeden Anfrage->Prozess->Antwort Kette. Proasync_receive_from
's Dokumentation, die der Anrufer behält Besitz der beiden Puffer und Endpunkt. Als solche kann es einfacher sein, zu verwalten der Lebensdauer von Objekten über die boost::shared_ptr. Ansonsten, wenn die Kette ist schnell genug, dass die gleichzeitige Ketten sind nicht erforderlich, es vereinfacht die Verwaltung, so dass die gleichen Puffer und Endpunkt verwendet werden pro Anfrage.Schließlich die
socket_base::reuse_address
Klasse ermöglicht eine Steckdose gebunden zu sein an eine Adresse, die bereits verwendet wird. Allerdings, ich nicht denke, es ist eine anwendbare Lösung hier, denn es wird allgemein verwendet:TIME_WAIT
Zustand.Eine andere Sache. Wo wird es angegeben, dass die endpoint-Klassen behandelt werden, in einer bestimmten Art und Weise. Einmal erhalte ich ein Endpunkt, als Ausgang param in async_receive_from ich kopiert (mit copy-Konstruktor) übergeben werden, um als "Staat" (also, dass ich weiß, wo das später zu reagieren), bis der moment Brauch ich zum senden der Antwort zurück.
Es ist in Ordnung, um mehrere asynchrone Operationen während auf ein Objekt; es ist nur angegeben, dass gleichzeitig fordert das Objekt zu unsicher sind. Wenn die socket-Aufrufe auftreten, die außerhalb einer Prozedur und nur einen thread aufrufen
io_service::run()
, dann buchen Sie die socket-Aufrufe inio_service
synchronisieren. Boost.Asio erfordert, dass der Aufrufer garantiert bestimmte Argumente bleiben gültig, bis der handler aufgerufen wird; es zwingt nicht die Benutzer zu verwalten, die Sie in einer bestimmten Weise. In einigen Fällen kann es einfacher sein, ordnen Sie die Objekte, die Lebensdauer der async-Kette über smart-Pointer.Buchungen im asio-users-mailing-Liste scheint zu bestätigen, was Sie sagen. Ich werde markieren Sie Ihre Antwort als akzeptiert.
Und während ich hier bin, wollte nur Fragen, ob Sie gemeinsam genutzte aus sich dieser Ansatz im Fall der Fehler, wenn man nicht die entsprechenden asynchronen Aufruf von der Vollendung Griff sind Sie garantiert, so bald verlassen Sie den Griff, Sie gelöscht zu bekommen?
InformationsquelleAutor Tanner Sansbury