2016-09-11 13 views
0

IRCサーバー(twitch.tv)に接続しようとしています。接続は成功しましたが、私はどのようにしてのサーバーから正しく読み取るかわかりません。具体的には、私はこの行に問題があります:boost::asio::read(s, boost::asio::buffer(reply, MAX_LENGTH));boost :: asio読み取り応答

応答メッセージのサイズよりも大きい番号のMAX_LENGTH(1024)を使用すると、プログラムは終了していないようです。私が64のような数字を使うと、私は64文字しか読むことができません。何とか\r\nか何かまで読むことができますか?どのようにこれを正しく行うことができますか?

#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

は 'read_some'を使用してください。バッファがいっぱいになるまで 'read'ブロックします。 –

答えて

1

Readは、バッファがいっぱいになってから返されるまで読み込もうとします。何かを読んだ後に関数を返すには、read_someを使います。

s.read_some(boost::asio::buffer(reply, MAX_LENGTH)); 
2

私はIRCプロトコルに精通していませんが、RFCを簡単に見てみると、テキストベースのようです。その場合、私は、boost :: asio :: read_untilを使用して応答を提案します。

これが問題に合っていると判断した場合、read_untilは内部的に指定された区切り文字を超える入力ストリームからバイトを読み取る可能性があることに注意してください。したがって、提供されたstreambuf(read_untilから返された値を使用する必要があります)からデータを抽出するときは、細心の注意を払ってください。

は、ドキュメントを見てください: http://www.boost.org/doc/libs/1_61_0/doc/html/boost_asio/reference/read_until/overload3.html

関連する問題