2017-01-09 3 views
0

Ich habe einen Server mit Boost ASIO erstellt. Es baut gut, aber sobald ich es ausführen, gibt es Segmentierung Fehler. Ich kann dieses Verhalten nicht wirklich herausfinden.Boost ASIO Server Segmentierung Fehler

Außerdem habe ich gelesen, dass dies möglicherweise daran liegt, dass ich das io_service -Objekt nicht explizit initialisiert habe. Wenn das der Fall ist, wie ändere ich dann diesen Code, damit ich das io_service-Objekt nicht von außerhalb der Klasse weitergeben muss.

Unten ist mein Code:

#include <iostream> 
#include <string> 
#include <memory> 
#include <array> 
#include <boost/asio.hpp> 

using namespace boost::asio; 

//Connection Class 

class Connection : public std::enable_shared_from_this<Connection>{ 

    ip::tcp::socket m_socket; 
    std::array<char, 2056> m_acceptMessage; 
    std::string m_acceptMessageWrapper; 
    std::string m_buffer; 
public: 
    Connection(io_service& ioService): m_socket(ioService) { } 

    virtual ~Connection() { } 

    static std::shared_ptr<Connection> create(io_service& ioService){ 
     return std::shared_ptr<Connection>(new Connection(ioService)); 
    } 


    std::string& receiveMessage() { 
     size_t len = boost::asio::read(m_socket, boost::asio::buffer(m_acceptMessage)); 
     m_acceptMessageWrapper = std::string(m_acceptMessage.begin(), m_acceptMessage.begin() + len); 
     return m_acceptMessageWrapper; 
    } 

    void sendMessage(const std::string& message) { 
     boost::asio::write(m_socket, boost::asio::buffer(message)); 
    } 

    ip::tcp::socket& getSocket(){ 
     return m_socket; 
    } 

}; 



//Server Class 

class Server { 
    ip::tcp::acceptor m_acceptor; 
    io_service m_ioService ; 


public: 
    Server(int port): 
     m_acceptor(m_ioService, ip::tcp::endpoint(ip::tcp::v4(), port)){ } 

    virtual ~Server() { } 

    std::shared_ptr<Connection> createConnection(){ 
     std::shared_ptr<Connection> newConnection = Connection::create(m_ioService); 
     m_acceptor.accept(newConnection->getSocket()); 
     return newConnection; 
    } 

    void runService() { 
     m_ioService.run(); 
    } 


}; 


int main(int argc, char* argv[]) { 
    Server s(5000); 
    auto c1 = s.createConnection(); 
    //do soething 
    s.runService(); 
    return 0; 
} 

Antwort

1

Sie sind Initialisierung, um Fragen, mit denen. In Ihrer Klasse Server haben Sie m_acceptor vor m_ioService deklariert und das nicht initialisierte Objekt io_service zum Erstellen des acceptor verwendet.

Ordnen Sie die Deklarationen in der Klasse einfach neu an. Überraschenderweise gab clang keine Warnung dafür.

class Server { 
    io_service m_ioService ; 
    ip::tcp::acceptor m_acceptor; 


public: 
    Server(int port): 
     m_acceptor(m_ioService, ip::tcp::endpoint(ip::tcp::v4(), port)){ } 

    virtual ~Server() { } 

    std::shared_ptr<Connection> createConnection(){ 
     std::shared_ptr<Connection> newConnection = Connection::create(m_ioService); 
     m_acceptor.accept(newConnection->getSocket()); 
     return newConnection; 
    } 

    void runService() { 
     m_ioService.run(); 
    } 


};