2017-11-23 4 views
1

Ich versuche, den Akzeptor, Socket und Endpunkt als Mitglieder in meine Klasse zu setzen, aber lief in Abstürze. Muss der Socket ein shared_ptr wie in diesem Question sein oder warum funktioniert das nicht?boost :: asio Absturz bei der Verwendung eines Mitglieds Akzeptor anstelle eines neuen

Wenn ich versuche, auf einem Server wie folgt ein Akzeptor-Setup:

tcp::endpoint ep(boost::asio::ip::address::from_string(localIpAddress), portNumber); 
tcp::acceptor a(io_service); 
tcp::socket s(io_service); 
a.open(ep.protocol()); 
a.bind(ep); 
a.listen(MAX_CONNECTIONS); 
a.async_accept(s, boost::bind(&WifiConnector::onAccept, this, boost::asio::placeholders::error)); 

es läuft ohne während der Ausführung abstürzt, aber wenn ich versuche, eine Buchse/Akzeptor/Endpunkt zu verwenden, die Mitglied von meiner WifiConnector-Klasse stürzt ab.

m_acceptor.open(localEndpoint.protocol()); // it crashes in this line already 
m_acceptor.bind(localEndpoint); 
m_acceptor.listen(MAX_CONNECTIONS); 
m_acceptor.async_accept(socket, boost::bind(&WifiConnector::onAccept, this, boost::asio::placeholders::error)); 

Erklärung in WifiConnector.hpp:

private: 
    tcp::socket m_socket; 
    tcp::acceptor m_acceptor; 
    tcp::endpoint m_localEndpoint; 

Initialisierung bei Klassenkonstruktors:

WifiConnector::WifiConnector() : 
    io_service(), 
    m_socket(io_service), 
    m_acceptor(io_service) 
{ 
    m_localIpAddress = "192.168.137.1"; 
    m_portNumber  = 30000; 
    m_localEndpoint = tcp::endpoint(boost::asio::ip::address::from_string(m_localIpAddress), m_portNumber); 
} 

, wenn er abstürzt, erhalte ich die folgende Ausnahme:

boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error> > 
+0

Angesichts der Tatsache, dass das Problem auftritt, wenn Sie den Code in eine Klasse umgestalten, denke ich, dass Sie wirklich eine [MCVE] bereitstellen müssen. Ist das nicht möglich, können Sie zumindest die Deklaration von 'WifiConnector :: io_service' anzeigen? –

Antwort

0
private: 
    tcp::socket m_socket; 
    tcp::acceptor m_acceptor; 
    tcp::endpoint m_localEndpoint; 

Dies wird nicht funktionieren. Sie erstellen mit den Standardkonstruktoren, was nicht Ihren Vorstellungen entspricht. Zum einen möchten Sie mit dem io service, den alles andere verwendet, konstruieren.

Machen Sie die Attribute Zeiger und konstruieren Sie sie mit neuen, wenn Sie den io_service haben.

+0

Der Standardkonstruktor wird nicht verwendet (es ist nicht möglich b/c gibt es keinen für Socket usw.), aber die rechten Konstruktoren werden aufgerufen (einschließlich io_service), wenn der WifiConnector-Konstruktor aufgerufen wird siehe "Initialisierung beim Klassenkonstruktor" – MrJonas

Verwandte Themen