Boost.Asio und IRC: Erwarte PING Nachricht vom Server.



  • Hi,

    Ich möchte mit einem IRC-Server kommunizieren, jedoch sendet mir der Server kein PING zurück. Das Ganze versuche ich gerade mit Boost.Asio zu lösen. Hier das Minimalbeispiel:

    #include <boost/asio.hpp>
    
    using boost::asio::ip::tcp;
    
    std::string get_message(tcp::socket& socket){
        boost::asio::streambuf buffer;
        boost::asio::read_until(socket, buffer, "\r\n");
    
        std::string message;
        std::istream stream{&buffer};
    
        std::getline(stream, message);
        return message;
    }
    
    int main(){
        boost::asio::io_service io;
    
        tcp::resolver resolver{io};
        tcp::resolver::query query{"irc.euirc.net", "6667"};
    
        auto iter = resolver.resolve(std::move(query));
        tcp::socket socket{io};
    
        std::cout << "Trying to connect..." << std::endl;
        boost::asio::connect(socket, iter);
    
        std::cout << "Connected!" << std::endl;
    
        socket.write_some(boost::asio::buffer("NICK foobarbazx\r\n"));
        std::cout << get_message(socket) << std::endl;
    
        socket.write_some(boost::asio::buffer("USER foobarbazx 0 * :Unknown\r\n"));
        std::cout << get_message(socket) << std::endl;
    }
    

    Ich kann mich noch erfolgreich zum IRC-Server verbinden. Nachdem ich das USER Kommando sende und auf eine Rückmeldung warte, passiert nichts mehr. Einige Sekunden später bekomme ich die Ping-Timeout-Nachricht. Folgendes empfange ich:

    NOTICE foobarbazx :*** If you are having problems connecting due to ping timeouts, please type /notice 8A19F2DC nospoof now.
    ERROR :Closing Link: foobarbazx[ip-static-94-242-201-229.as5577.net] (Ping timeout)
    

    Ich habe auch bereits vergeblich versucht "NOTICE XXXXXXXX nospoof\r\n" nach dem NICK Kommando zu senden, da ändert sich nichts dran. Ich habe auch bereits versucht, als erstes das USER Kommando und dann erst das NICK Kommando zu senden, was jedoch nur zu einem Ping-Timeout (ohne NOTICE) führt.

    Jemand eine Ahnung, was ich falsch machen könnte?



  • Der Buffer, den du in get_message konstruierst, enthaelt u.U. mehr als du aus ihm liest. Sobald er out of Scope geht, verlierst du damit Zeichen, die schon eingelesen, aber noch nicht verarbeitet wurden.

    Edit: Es ist uebrigens keine gute Idee, write_some zu verwenden, da es - wie der Name schon sagt - u.U. nicht alle Daten sendet. Du solltest dafuer boost::asio::write (<boost/asio/write.hpp>) mit Completion Condition transfer_all() (<boost/asio/completion_condition.hpp>) verwenden.



  • Tatsächlich.

    Ein

    std::string message, line;
    
        while(std::getline(stream, line))
            message += line;
    

    hat das Problem nun gelöst.



  • Es ist uebrigens auch keine gute Idee, sich darauf zu verlassen, dass der Server \r\n sendet. Das letzte mal als ich es getestet habe, hat euirc nur \n gesendet.


Anmelden zum Antworten