2016-03-22 13 views
-1

Wie kann ich Clients mit boost.asio und UDP unterscheiden, wobei alle Boost-Beispiele eine Mitgliedsvariable verwenden, um jeweils einen Remote-Endpunkt zu speichern. Ich muss eine Liste der Endpunkte halten und bestimmen, an welches Objekt die empfangenen Daten gesendet werden sollen, wenn es ankommt. Im Moment habe ich Code wie diesesClients mit boost asio unterscheiden

void Receive() { 
     boost::asio::ip::udp::endpoint client_endpoint; 
     char data[32]; 
     socket_.async_receive_from(boost::asio::buffer(data, 32), client_endpoint, 
      boost::bind(&MyClass::onReceive, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); 
    } 

aber die client_endpoint den Gültigkeitsbereich verlassen wird (nicht verfügbar) in der Handler-Funktion, und ich möchte ein neues Client Objekt erstellen, wenn dies das erste Mal ist Ich erhalte von sie, oder aktualisieren Sie das entsprechende Client-Objekt, wenn dies nicht der Fall ist.

Ich dachte über eine std::set<boost::ip::udp::endpoint> client_sessions_; als eine Mitgliedsvariable zu meinem Server halten, aber client_endpoint ist immer noch nicht gefüllt, bis der Async-Aufruf ausgelöst wird.

Wie gehe ich damit um?

Antwort

1

Sie können Ihren Endpunkt in shared_ptr halten. Außerdem haben Sie einen Fehler mit asio :: buffer - async_receive_from schreibt in den Stack der Funktion, die bereits beendet wurde, möglicherweise korrumpierenden Stapel. Correct Snippet sollte so etwas wie sein:

void Receive() { 
     auto client_endpoint = std::make_shared<boost::asio::ip::udp::endpoint>(); 
     std::shared_ptr<char> data(new char[32], std::default_delete<char[]>()); 
     socket_.async_receive_from(boost::asio::buffer(data.get(), 32), *client_endpoint, 
      boost::bind(&MyClass::onReceive, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred, data, client_endpoint)); 
    } 
    //... 
    void MyClass::onReceive(boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred, std::shared_ptr<char> data, std::shared_ptr<boost::asio::ip::udp::endpoint> client_endpoint); 

Oder können Sie verwenden, um neue/Löschen der Einfachheit halber (weniger bevorzugt)

+0

ich nicht wusste, dass ich die Unterschrift des Rückruf ändern könnte – shane