2016-05-25 12 views
1

Ich möchte std::move(my_asio_socket) zu der Instanz einer Klasse. Was, wenn ich dasselbe für eine Instanz einer anderen Klasse tue?Kann ich Asio-Socket-Referenzen in zwei verschiedenen Klasseninstanzen booten?

Mein Ziel ist es, read_async in einer Klasseninstanz (wir Klasse A sagen) und write_async in der anderen auszuführen (sagen wir mal Klasse B). Wegen einiger Funktionalität Implementierungen sollte ich es so machen.

Jeder Vorschlag wäre nett.

AKTUALISIERT

daran zu arbeiten ist nicht richtig, wie ich erwartet hatte.
Der VS2015 (VC14 Compiler) zeigt mir eine Art Ausnahme während des Debuggens:

Microsoft C++ exception: boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error> > at memory location 0x02D8E3BC.

Und nachdem ich continue in VS traf mich zeigen, dass:

Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.

Wie ich sagte, Ich versuche boost::move (oder std::move) den Socket zu anderen Klasseninstanz. Hier ist ein Code-Snippet von dem, was ich tue:

boost::shared_ptr<connection> new_connection_;//it's a field in my class, 
//that's why i should reset it later 
new_connection_.reset(new connection(std::move(socket_), io_service_)); 
new_connection_->start(); 

Hier ist mein connection Ctor:

connection::connection(boost::asio::ip::tcp::socket sock, boost::asio::io_service& io_ptr) 
    : socket_(boost::move(sock)), 
     io_ptr_(io_ptr), 
     remote_ep(socket_.remote_endpoint()), 
     //request_handler_(new request_handler(boost::move(socket_))), 
     work(new boost::asio::io_service::work(io_ptr)) 
    { 
     boost::shared_ptr<request_handler> req_ptr(new request_handler(boost::move(socket_))); 
     request_handler_.swap(req_ptr); 
    } 

Wie Sie sehen können, habe ich versucht, in der Kommentarzeile zu initialisieren, aber es zeigt mir das gleiche Ergebnis.
Hier ist der Ctor für request_handler:

request_handler::request_handler(boost::asio::ip::tcp::socket sock): 
              socket_(boost::move(sock)){ } 

Und hier ist meine Methode connection::start, wo das Problem erkennt:

void connection::start() 
{ 
    boost::asio::ip::tcp::socket::keep_alive kl(true); 
    boost::asio::ip::tcp::socket::enable_connection_aborted eca(true); 
    // here it breaks, when trying to set an option 
    socket_.set_option(eca); 
    socket_.set_option(kl); 

    socket_.async_read_some(boost::asio::buffer(buffer_), 
     boost::bind(&connection::handle_read, shared_from_this(), 
      boost::asio::placeholders::error, 
      boost::asio::placeholders::bytes_transferred)); 
} 

Dieses Problem wird nur dann angezeigt, wenn ich socket in die neue Instanz von request_handler zu bewegen verwenden, um . Wenn ich nicht bin - dann geht alles ok. Ich kann nicht verstehen, warum es sein könnte, aber scheint wie meine socket_ (ich erkläre es überall ohne & oder *) Feld von connection Klasse ist verloren oder Art von. Aber der Debugger zeigt mir nicht wie null, also weiß ich nicht, was es ist.

Antwort

1

In general es ist nicht garantiert:

Verschieben Zuweisungsoperator typischerweise "stehlen", die durch das Argument gehalten Ressourcen (zB Zeiger auf dynamisch zugewiesenen Objekte, Filedeskriptoren, TCP-Sockets, I/O-Streams, Laufen Threads, etc.), anstatt Kopien von ihnen zu machen und das Argument in einem gültigen, aber ansonsten unbestimmten Zustand zu belassen. Zum Beispiel kann move-assigning von einem std :: string oder von einem std :: vector dazu führen, dass das Argument leer bleibt. Auf dieses Verhalten sollte jedoch nicht Verlass sein.

Aber nach der Dokumentation für tcp::socket es in dem gleichen Zustand gelassen wird:

Bewegung Folgenden wird die fahrenen von Objekt im selben Zustand wie der basic_stream_socket wenn konstruiert unter Verwendung von (io_service &) Konstrukteur.

+0

danke für die antwort, ich dachte auf die gleiche weise ... aber ich war verwirrt, wegen der "gestohlenen" ressourcen wie du erwähnt. Ich werde es testen und Ihre Antwort akzeptieren, nachdem es in Ordnung geht :) –

+0

nicht wirklich gute Nachrichten, weil es nicht wie erwartet funktioniert. Kann ich etwas falsch machen? Ich habe den Beitrag mit einer Problembeschreibung aktualisiert. @ Teivaz - überprüfen Sie es bitte. –

+0

Ich kann jetzt nicht wirklich sagen, was hier gerade falsch ist. Was ich sehe, ist 'new_connection_.reset (neue Verbindung (std :: move (socket_), io_service _));' Hier müssen Sie nicht in 'std :: move' springen, da Sie den Konstruktor' connection nicht überladen haben (socket &&, io_service &); '. Ich werde versuchen, morgen zurück zu kommen. – teivaz