Boost::asio读取响应
boost::asio read response
我正在尝试连接到IRC服务器(twitch.tv)。连接成功,但我不知道如何从服务器正确读取响应。更具体地说,我在这一行遇到了麻烦:boost::asio::read(s, boost::asio::buffer(reply, MAX_LENGTH));
。
如果我使用MAX_LENGTH
(1024),这是一个大于响应消息大小的数字,那么程序似乎不会终止。如果我使用像64这样的数字,我只能读取消息的64个字符。我能不能读到rn
之类的?我怎样才能正确地做到这一点呢?
#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:123rn";
char NICK[] = "NICK 123rn";
char USER[] = "USER 123rn";
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 << "connectedn";
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 messagesn";
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尝试读取直到缓冲区满后才返回。如果您希望函数在读取任何内容后返回,请使用read_some.
s.read_some(boost::asio::buffer(reply, MAX_LENGTH));
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- 使用新行和不使用新行读取文件
- 读取文件并输入到矢量中
- 用c++从输入文件中读取另一行
- 读取文件的最后一行并输入到链接列表时出错
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 无法找到/读取配置文件.conf-FileIOException
- 如何使用Luacneneneba API正确读取字符串和表参数
- C++将文本文件中的数据读取到结构数组中
- 同步读取多个 TCP 响应
- 如何使用软化工具包从 OPC UA 服务器异步读取操作回调中的数据值响应中获取 NodeId 详细信息
- 使用RAW套接字读取ICMP响应
- 读取系统() 命令错误响应消息
- LibNet读取ARP响应
- 如何使用Poco C++从HTTP服务器响应中读取图像内容
- 我如何从QNetworkReply读取内容(http响应体)
- 读取POCO HTTPClientRequest的响应
- 将bash命令的终端响应读取到c++变量中
- Boost::asio读取响应
- 在从上游读取响应标头时,c++和fastcgi-upstream提前关闭了fastcgi stdout