boost::asio in boost::threads benutzen



  • Mein code:

    #include <iostream>
    #include <boost/thread.hpp>
    #include <boost/asio.hpp>
    using boost::asio::ip::tcp;
    
    //definitions
    std::string IP = "127.0.0.1";
    int Port = 7777;
    
    void serverThread()
    {
        boost::asio::io_service io_service;
        tcp::socket client(io_service);
    
        tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), Port));//statup server
        acceptor.accept(client);
    
        ///now send endless data
        boost::system::error_code error;
        boost::array<char, 1000> buffer;
    
        //fill the buffer
        for(int i = 0; i < buffer.size(); i++)
            buffer.at(i) = 'A';
    
        while(1)//start sending
            boost::asio::write(client, boost::asio::buffer(buffer), boost::asio::transfer_all(), error);
    }
    
    void clientThread()
    {
        boost::asio::io_service io_service;
        tcp::socket server(io_service);
    
        //connecting
        tcp::resolver resolver(io_service);
        tcp::resolver::query query(IP, Port);
    
        tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
        tcp::resolver::iterator end;
    
        boost::system::error_code error = boost::asio::error::host_not_found;
    
        while(error && endpoint_iterator != end)
        {
            server.close();
            server.connect(*endpoint_iterator++, error);
        }
        if(error)
            return;
    
        ///get endless data
        boost::array<char,1000> buffer;
        boost::system::error_code err;
    
        while(1)//start getting
            server.read_some(boost::asio::buffer(buffer), err);
    }
    
    int main()
    {
        try
        {
            //create threads
            boost::thread server(serverThread);
            boost::thread client(clientThread);
    
            //start them
            server.join();
            client.join();
        }
        catch(boost::system::system_error e)
        {
            std::cout << "error! " << e.what();
        }
    }
    

    Ich bekomme die Exception:

    terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error> >'
      what():  Invalid argument
    

    Ich vermute, dass io_service irgendwie mit boost::thread Probleme macht.
    Jemand ne Idee?

    Greets,
    Finnhax



  • Anscheinend wird irgendwo eine Ausnahme mit der Nachricht "Invalid argument" geworfen und der Thread wegen der nicht behandelten Ausnahme beendet.



  • Wieso kein Async IO?



  • Weil ich damit in einem Programm einen synchronen Client und synchronen Server erzeugen will 😉



  • Finn schrieb:

    Weil ich damit in einem Programm einen synchronen Client und synchronen Server erzeugen will 😉

    Wenn du Threads benutzt ist es kein bischen "synchroner".

    Threads raus und statt join() ein io_service::run, dazu async Operationen und du hast exakt das selbe Verhalten, abgesehen davon dass du keine Threading-Probleme hast, es schneller ist und weniger Resourcen verbraucht.



  • Nunja genaugenommen ergeben sich schon große Unterschiede bei der Benutztung von Sync mit Threads und Async. Aber du hast recht, dass es wahrscheinlich drauf rauslaufen wird, dass ich es async mache!
    Danke trotzdem 😉


Anmelden zum Antworten