首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >*asio读取响应

*asio读取响应
EN

Stack Overflow用户
提问于 2016-09-11 17:15:08
回答 2查看 1.2K关注 0票数 0

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

如果我使用MAX_LENGTH (1024),它比响应消息的大小还要大,那么程序似乎不会终止。如果我使用像64这样的数字,我只能读取消息的64个字符。我能读到\r\n之类的吗?我怎么才能做好这件事?

代码语言:javascript
复制
#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;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-11 17:27:32

朗读尝试读取,直到缓冲区满了才返回。如果您希望函数在读取任何内容之后返回,请使用一些

代码语言:javascript
复制
s.read_some(boost::asio::buffer(reply, MAX_LENGTH));
票数 1
EN

Stack Overflow用户

发布于 2016-09-12 08:49:38

我不熟悉IRC协议,但是从快速查看RFC的情况来看,它看起来是基于文本的。在这种情况下,我建议使用boost::asio::read_until作为响应。

如果您认为这适合您的问题,请记住,read_until内部可能会在指定的分隔符之外从传入流读取字节。因此,在从提供的streambuf中提取数据时请密切注意(您需要使用从read_until返回的值)。

查看文档:直到/重载3.html

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39438657

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档