boost read_until 不会在分隔符处停止

2024-04-17

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

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


该文档似乎暗示了这一点:

"该函数用于读取数据到指定的streambuf中untilStreambuf 的获取区域包含指定的分隔符。”

但仔细看看:

直到Streambuf的获取区域包含 ...

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

boost read_until 不会在分隔符处停止 的相关文章

随机推荐

  • facebook画布高度在ie8和firefox中没有设置滚动

    嘿 我想设置一个长页面应用程序 没有FB会限制我的应用程序的高度并附加滚动 我做了 iframes canvas 并在设置中自动调整大小并应用该代码 它限制了我在 ie 中显示滚动并在 firefox 中剪切内容 代码在这里 http pa
  • 在python中使用windows资源管理器浏览器存储文件路径

    我在 python 中编写了一些加密代码 它从用户那里获取原始输入消息 然后使用 AES 对其进行加密和解密 现在我想增强工作 我希望我可以从代码中打开 Windows 资源管理器并浏览到计算机上的任何文件 选择它 当我按 确定 按钮时 文
  • noscript 标签的正文样式?

    如果没有启用 JavaScript 我希望我的身体有overflow hidden 没有滚动条 我该如何解决这个问题 是否可以在 内部使用 noscript 标签并在其中设置特定样式 如果你的意思是对于 HTML 文档 我会构建 HTML
  • 根据 XSD 验证 XML 时忽略元素顺序

    我们有一个 XML 需要根据 XSD 进行验证 XML 由 XSTREAM 生成 我们正在使用 jaxp api 根据相应的 XSD 验证 XML 不幸的是 目前我们的测试用例失败 因为生成的 XML 的元素 标签的顺序 顺序与 XSD 不
  • 如何根据本地子网自动切换ssh配置?

    当我在某个网络 子网为 10 10 11 x 上时 我需要跳过中间主机才能到达目的地 因为我无法更改目的地端口 并且可以退出受限网络的端口有限 我成功地使用了如下所示的 ssh 配置 Host web direct web HostName
  • Android:即使视图滚动,如何将广告对齐到屏幕底部?

    之前我问过一个问题 至今没能解决 http stackoverflow com questions 3126347 android relativelayout how to alignparentbottom when wrapped i
  • 有没有办法通过 JNI 将 Java 数组传递给 C 而无需复制它?

    据我所知 使用GetDoubleArrayElements 是JVM决定是否复制Array的元素 这种情况下 有什么办法可以避免复制呢 如果没有 有没有其他方法可以从Java转移到C而无需复制 我正在传递非常大的数组 我希望我可以避免复制
  • Soapui 添加节点到请求 (Groovy)

    我遇到了问题 所以我得到了这样的 WSDL
  • 如何使用 python + NumPy / SciPy 计算滚动/移动平均值?

    numpy scipy 上似乎没有简单计算移动平均值的函数 导致复杂的解决方案 https stackoverflow com questions 12816011 weighted moving average with numpy co
  • 用 Ruby 测量两根弦之间的距离?

    我可以用 Ruby 测量两根弦之间的距离吗 I e compare Test est Returns 1 compare Test Tes Returns 1 compare Test Tast Returns 1 compare Test
  • IIS 6 上的多个域、相同的 Web 应用程序

    在 IIS 6 上 是否可以让多个域名指向同一个 Web 应用程序 并根据域名有条件地从 Web 应用程序内提供 CSS 我需要在同一个 Web 应用程序上托管数百个不同的 皮肤 皮肤取决于域名 而且我真的不想启动大量的 Web 应用程序
  • 如何以编程方式获取服务的状态(正在运行/已停止)

    我需要在我的 C 应用程序中获取 Windows 打印后台处理程序 服务的状态 shikarssj提供的功能运行良好 加载服务时只需要管理员权限 这是一个不需要完全许可的版本 include
  • Ionic/Cordova 更改 Android 导航栏颜色

    我正在尝试更改 Android 中导航栏的颜色 在底部 带有返回键和返回键 在没有硬件返回键和返回键的手机上 在我使用 Cordova 的 Ionic 应用程序中 有没有办法做到这一点 Example 发现了这个很棒的 cordova 插件
  • 如何设置 IntelliJ Idea Scala 项目来识别本地 Ivy2 缓存?

    您可能知道 新版本的 SBT 0 11 旨在维护公共库缓存 ivy2 cache而不是复制项目目录中的完整依赖项集 但是 IntelliJ Idea 我使用 SBT 插件生成 Idea 项目 默认似乎忽略了公共缓存 只看到放在项目目录下的库
  • 将 Python 转换为 R

    我知道有一个模块 rpy 和 rpy2 可以将 R 代码转换为 Python 有什么简单的方法可以做到相反吗 rpy 2 不转换代码 它只允许您通过 python 与 R 进行通信并从 python 中发出 R 命令的接口 鉴于 R 非常依
  • dyld:未加载库:@rpath/SwiftyJSON.framework/SwiftyJSON

    我一直在使用模拟器来测试我的应用程序 今天 我决定在模拟器中使用其他设备来测试它 令我惊讶的是 它在某些设备上启动时崩溃 而在其他设备上却运行得很好 我的应用程序构建运行于 iPad Air 可调整大小的iPad iPhone 5S iPh
  • 在结构体中动态分配结构体

    我正在动态分配一个具有不同结构作为成员的结构 struct a other members struct b struct b基本上持有一个指向另一个的指针struct b 所以想到struct b作为链接列表 如果我动态分配struct
  • 派生类作为默认参数 g++

    请看一下这段代码 template
  • 如何在java中使用twitter4j发布推文?

    我可以使用 twitter4j 登录 twitter 并获取有关登录用户的信息 但我无法从我的应用程序发布推文 我正在使用 Java Web 应用程序来发布推文 请参阅下面我使用的代码 String ACCESS TOKEN ttttttt
  • boost read_until 不会在分隔符处停止

    我使用 boost read until 函数来促进通过套接字接收和解析 HTTP 消息 所以我是什么trying要做的就是从套接字中 read until 直到 r n 我认为应该给我一行 HTTP 标头 每个 HTTP 标头行以 r n