【问题标题】:boost read_until does not stop at delimiterboost read_until 不会在分隔符处停止
【发布时间】:2013-11-28 00:54:34
【问题描述】:

我正在使用 boost read_until 函数来帮助通过套接字接收和解析 HTTP 消息。所以我正在尝试 做的是从套接字读取_until 直到\r\n,我认为这应该给我一行HTTP 标头。 (根据标准,每个 HTTP 标头行都以 \r\n 结尾。)但是,我实际上从 read_line 得到的是整个标头,有几行长。 (标头以\r\n\r\n 结尾,或者换句话说,一个空行。另外,根据HTTP 标准。)这是一个sn-p 代码。 sock 是套接字文件描述符。

boost::system::error_code err;
io::streambuf request_buff;

io::read_until(sock, request_buff, "\r\n", err); // read request line
if (err)
  throw Exception(string("Failed to read HTTP header request line from socket: ") + err.message());
cerr << "Read " << request_buff.size() << " bytes." << endl;

istream request(&request_buff);
try {
  request >> m_strMethod >> m_strPath >> m_strHttpVersion;

} catch (std::exception& e) {
  throw Exception(string("Failed to parse HTTP header: ") + e.what(), e);
}

if (!request)
  throw Exception("Failed to read HTTP header");
if (!alg::istarts_with(m_strHttpVersion, "HTTP/"))
  throw Exception(string("Malformed HTTP header: expected HTTP version but got: ") + m_strHttpVersion);

string strTemp;
while (std::getline(request, strTemp))
{
  cerr << "Extra line size = " << strTemp.size() << endl;
  cerr << "Extra line: '" << strTemp << '\'' << endl;
}

我希望看到的输出表明它读取了 HTTP 消息第一行中的字节数,并且没有“额外”输出。相反,我得到的是整个 HTTP 标头中的字节数,以及一个空白的额外行(这可能是因为 >> 操作没有消耗第一行末尾的换行符),然后是标题和另一个空白行(表示标题的结尾,如上所述)。为什么 read_until 从 socket 中读取的内容比 header 的第一行多,并放入 request_buff 中?

注意,我使用 netcat 来接收请求,并且可以正常通过。所以 HTTP 消息本身的格式似乎是正确的。

【问题讨论】:

    标签: c++ sockets boost boost-asio istream


    【解决方案1】:

    文档似乎暗示了这一点:

    "该函数用于将数据读入指定的streambuf 直到streambuf 的get 区域包含指定的分隔符。”

    但仔细看:

    直到 streambuf 的 get 区域包含 ...

    因此,它不会承诺就此止步。它只是承诺在读取包含您的分隔符的块后立即返回给您。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 2010-12-10
    • 1970-01-01
    • 2019-02-06
    • 2022-01-20
    相关资源
    最近更新 更多