c++ - 没有从 boost::asio 套接字读取所有数据
问题描述
我正在尝试同步使用 boost::asio 套接字通过 IMAP 获取电子邮件列表。我的实现是
std::string cmail::ImapClient::execute(const std::string &cmd)
{
boost::system::error_code error;
boost::asio::write(socket, boost::asio::buffer(cmd), error);
if(error)
{
spdlog::error("Failed to dispatch command " + cmd + " because " + error.message());
return "";
}
boost::asio::streambuf buffer;
boost::asio::read_until(socket, buffer, '\n', error);
if(error)
{
spdlog::error("Failed to receive response for command " + cmd + " because " + error.message());
return "";
}
boost::asio::streambuf::const_buffers_type data = buffer.data();
std::string response(boost::asio::buffers_begin(data), boost::asio::buffers_begin(data) + buffer.size());
if(spdlog::default_logger()->level() == spdlog::level::trace)
{
std::string s = response;
s.pop_back();
spdlog::trace("S: " + s);
}
return response;
}
cmd
我通过这个方法的实际是A002 FETCH 1:* (BODY.PEEK[HEADER.FIELDS (DATE FROM SUBJECT)] FLAGS)
. 收件箱中有 5 封电子邮件。所以1.*
应该获取 5 封电子邮件。但是,我只获得电子邮件 1 和 2 的完整电子邮件信息,以及第三封电子邮件的“发件人”字段。
如果我将命令更改为A002 FETCH 2:5 (BODY.PEEK[HEADER.FIELDS (DATE FROM SUBJECT)] FLAGS)
,我将再次获得电子邮件 2 和 3 的预期内容,而在response
4 号的“发件人”字段之后不包含任何内容。
编辑:
A001 SEARCH SINCE 10-Apr-2020
我通过发出服务器响应的命令来验证收件箱中有 5 封邮件* SEARCH 1 2 3 4 5
。
至于我如何验证服务器响应了 5 封电子邮件的数据,根据协议规范,服务器应该完成 withA002 OK ...
或A002 NO ...
的响应A002 BAD ...
。我得到的响应没有发送这个终止子句。此外,在这两种情况下,负载看起来都被截断了,响应的大小为 512 个字符。不确定这个验证有多严格,但 512 的字节数似乎指向某个大小限制......
解决方案
推荐阅读
- javascript - useContext 返回 udefined
- colors - 如何将线条样式应用于 Seaborn 线图中的特定线条?
- javascript - 带有 github Nodejs CI 操作的 CI 意外失败
- python - TypeError:'function'和'str'的实例之间不支持'<'
- javascript - 等待从 Firestore 读取的函数的数组出现问题
- python - Python:按时间过滤python数据帧
- statistics - 旧状态的高斯近似
- typescript - 具有可变原因的模板字符串文字:类型 s 的参数不可分配给类型参数
- r - 转换从 R 中的 excel 导入的自定义日期格式
- css - Vuetify v-bottom-navigation:将按钮靠得更近?