繁体   English   中英

boost :: asio读取响应

[英]boost::asio read response

我正在尝试连接到IRC服务器(twitch.tv)。 连接成功,但是我不知道如何正确地从服务器读取 响应 更具体地说,我在这一行遇到麻烦: boost::asio::read(s, boost::asio::buffer(reply, MAX_LENGTH));

如果我使用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;
}

我对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

读取尝试读取直到返回缓冲区满之前。 如果您希望函数在全部读取后返回,请使用read_some

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM