首页 > 解决方案 > 没有从 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 的预期内容,而在response4 号的“发件人”字段之后不包含任何内容。

编辑:

A001 SEARCH SINCE 10-Apr-2020我通过发出服务器响应的命令来验证收件箱中有 5 封邮件* SEARCH 1 2 3 4 5

至于我如何验证服务器响应了 5 封电子邮件的数据,根据协议规范,服务器应该完成 withA002 OK ...A002 NO ...的响应A002 BAD ...。我得到的响应没有发送这个终止子句。此外,在这两种情况下,负载看起来都被截断了,响应的大小为 512 个字符。不确定这个验证有多严格,但 512 的字节数似乎指向某个大小限制......

标签: c++boost-asio

解决方案


推荐阅读