c++ - boost read_until 不会在定界符处停止

标签 c++ sockets boost boost-asio istream

我正在使用 boost read_until 函数来 boost 通过套接字接收和解析 HTTP 消息。所以我尝试做的是从套接字读取直到 \r\n,我认为这应该给我一行 HTTP header 。 (根据标准,每个 HTTP header 行以 \r\n 结尾。)但是,我实际上从 read_line 得到的是整个 header ,有几行长。 ( header 以 \r\n\r\n 结尾,或者换句话说,一个空行。另外,根据 HTTP 标准。)这是一个代码片段。 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 header 中的字节数,以及一个空白的额外行(这可能是因为 >> 操作没有在第一行末尾使用换行符),然后是标题和另一个空行(表示标题的结尾,如上所述)。为什么 read_until 从套接字中读取的内容多于 header 的第一行并将其放入 request_buff?

请注意,我使用 netcat 来接收请求,并且一切正常。因此 HTTP 消息本身似乎格式正确。

最佳答案

文档似乎暗示了这一点:

"This function is used to read data into the specified streambuf until the streambuf's get area contains the specified delimiter."

但仔细看:

until the streambuf's get area contains ...

因此,它并没有 promise 就此止步。它只是 promise 在读取包含您的定界符的 block 后立即返回给您。

关于c++ - boost read_until 不会在定界符处停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20255917/

相关文章:

c++ - valgrind 在使用 https 时报告 libcurl 的问题

javascript - Socket.io 断开连接功能不起作用

c - 无法接收使用 NETLINK_ROUTE channel 从内核模块发送到用户应用程序的自定义消息

c++ - 在C++中一一打印字符、数字和特殊字符

c++ - 为可迭代对象定义模板运算符<<

c++ - "boost::mpl::identity<T>::type"在这里有什么意义?

C++ boost::split 首先

c++ - boost::function 类

c++ - Tensorflow:与共享库的动态链接

android - 无法通过 TCP 从 java 套接字向 .net tcp 服务器发送数据