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.
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 :) –
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. –
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