2016-09-11 13 views
0

Ich versuche, eine Verbindung zu einem IRC-Server (twitch.tv) herzustellen. Die Verbindung ist erfolgreich, aber ich weiß nicht, wie die Antwort vom Server richtig lesen. Genauer gesagt habe ich Probleme in dieser Zeile: boost::asio::read(s, boost::asio::buffer(reply, MAX_LENGTH));.boost :: asio Antwort lesen

Wenn ich MAX_LENGTH (1024), die eine Zahl größer als die Größe der Antwort Nachricht ist, dann scheint das Programm nicht zu beenden. Wenn ich eine Nummer wie 64 verwende, kann ich nur 64 Zeichen der Nachricht lesen. Kann ich irgendwie bis \r\n oder so etwas lesen? Wie kann ich das richtig machen?

#include <boost/asio.hpp> 
#include <iostream> 

using namespace std; 

int main(int argc, char *argv[]) 
{ 
    try 
    { 
     char   HOSTNAME[] = "irc.chat.twitch.tv"; 
     char   PORT[]  = "6667"; 
     char   PASS[]  = "PASS oauth:123\r\n"; 
     char   NICK[]  = "NICK 123\r\n"; 
     char   USER[]  = "USER 123\r\n"; 
     const size_t MAX_LENGTH = 1024; 

     boost::asio::io_service  io_service; 
     boost::asio::ip::tcp::socket s(io_service); 
     boost::asio::ip::tcp::resolver resolver(io_service); 
     boost::asio::connect(s, resolver.resolve({HOSTNAME, PORT})); 
     cout << "connected\n"; 

     boost::asio::write(s, boost::asio::buffer(PASS, strlen(PASS))); 
     boost::asio::write(s, boost::asio::buffer(NICK, strlen(NICK))); 
     boost::asio::write(s, boost::asio::buffer(USER, strlen(USER))); 
     cout << "sent 3 messages\n"; 

     char reply[MAX_LENGTH]; 

     size_t reply_length  = boost::asio::read(s, 
      boost::asio::buffer(reply, MAX_LENGTH)); 
     // execution never reaches here 
     std::cout << "Reply is: "; 
     std::cout.write(reply, reply_length); 
     std::cout << "\n"; 
    } 
    catch (std::exception &e) 
    { 
     std::cerr << "Exception: " << e.what() << "\n"; 
    } 

    return 0; 
} 
+0

Verwenden 'read_some'. 'Blöcke 'lesen, bis der Puffer voll ist. –

Antwort

1

Read versucht zu lesen, bis der Puffer voll ist, bevor er zurückkehrt. Wenn Sie möchten, dass die Funktion nach dem Lesen von irgendetwas zurückkehrt, verwenden Sie read_some.

2

Ich bin nicht vertraut mit IRC-Protokoll, aber von einem kurzen Blick auf die RFC sieht es aus wie es ist textbasiert. In diesem Fall würde ich boost :: asio :: read_until für die Antwort vorschlagen.

Wenn Sie entscheiden, dass dies zu Ihrem Problem passt, denken Sie daran, dass read_until intern möglicherweise Bytes aus dem eingehenden Stream über das angegebene Trennzeichen hinaus liest. Achten Sie also genau darauf, wenn Sie Daten aus dem bereitgestellten streambuf extrahieren (Sie müssen den von read_until zurückgegebenen Wert verwenden).

Werfen Sie einen Blick in die Dokumentation: http://www.boost.org/doc/libs/1_61_0/doc/html/boost_asio/reference/read_until/overload3.html