我正在尝试连接到IRC服务器(twitch.tv)。连接是成功的,但我不知道如何正确地从服务器读取 response。更确切地说,我在这一行中遇到了麻烦: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;
}发布于 2016-09-11 17:27:32
朗读尝试读取,直到缓冲区满了才返回。如果您希望函数在读取任何内容之后返回,请使用一些。
s.read_some(boost::asio::buffer(reply, MAX_LENGTH));发布于 2016-09-12 08:49:38
我不熟悉IRC协议,但是从快速查看RFC的情况来看,它看起来是基于文本的。在这种情况下,我建议使用boost::asio::read_until作为响应。
如果您认为这适合您的问题,请记住,read_until内部可能会在指定的分隔符之外从传入流读取字节。因此,在从提供的streambuf中提取数据时请密切注意(您需要使用从read_until返回的值)。
查看文档:直到/重载3.html
https://stackoverflow.com/questions/39438657
复制相似问题