【问题标题】:boost::iostream readline stop after 4096 bytesboost::iostream readline 在 4096 字节后停止
【发布时间】:2014-12-25 05:43:39
【问题描述】:

我正在编写一个通过网络传输大数据的程序,我正在使用 boost asio iostream 来完成它。

这是我的代码:

boost::asio::ip::tcp::iostream s;
s.connect("localhost","4000"); 
string ss;
getline(s,ss);

但当输出超过 4096 个字符时,getline 不会读取完整的行并将其分成两条消息。

当输入很大时读取单行的正确方法是什么?

【问题讨论】:

  • 那是什么操作系统?它是真正在本地主机上还是涉及网络基础设施? (网卡、电缆、交换机?)。在我的盒子上,它的工作原理与宣传的完全一样,没有(明显)限制
  • os 是 linux,不,它是真正的 localhost。
  • 能否提供发件人的代码? 编辑: 另外它与char c; while(s.get(c)) ss += c; 相比如何
  • @Galik 应该可以工作,实际上它可以与while(getline(s,tmp)) ss += tmp 一起工作,就像我阅读问题的方式一样
  • @sehe 啊是的,我应该在那里放一个行尾检查:char c; while(s.get(c) && c != '\n') ss += c;

标签: c++ boost boost-asio


【解决方案1】:

我不会用

复制这个
  • Ubuntu linux 14.10 64 位
  • gcc 4.8.2
  • boost_1_57
  • 本地流量

您是否检查过输入中没有换行符?


如果我向它提供持续的输入流,我不会检测到此类问题。例如。与 netcat,Live On Coliru

for a in {1..1024}; do echo -n 0123456789; done | nc -l 6767& 

这会发送 10k 的数据而无需换行

./a.out | wc 

这会计算我们的代码返回的行数、单词和字符数:

 0       1   10240

代码

供参考

#include <boost/asio.hpp>
#include <iostream>

int main() {
    boost::asio::ip::tcp::iostream socket("127.0.0.1","6767"); 

    std::string as_read;
    std::getline(socket,as_read);

    std::cout << as_read;
}

【讨论】:

  • 我刚刚试过你的代码和你的 bash 脚本。我也有同样的问题。我的 gcc 版本是 4.9.2 和 localhost 流量。在archlinux上
  • 让我们开始称它为“行为”而不是问题。 ulimit -a 有什么东西吗?什么 boost 和内核版本?
  • 我的 boost 版本是 1.57.0-2,这是我的 ulimit -a 输出:pastebin.com/0PXKNJpv。我的内核版本是3.14.25-1-lts。此外,我希望我的代码可以在每台计算机上运行,​​而无需更改任何内容。
  • 我刚刚安装了我的第一个 Arch,只是为了测试一下:demo animation gif - 即使用股票内核和全新安装。刚刚为这个演示安装了base-devel vim boost openbsd-netcat screen。我强烈怀疑一些非标准问题在起作用(SELinux、AppArmor、iptables、sysctl 调整等等)。
  • @MohammadRazeghi 哦,对不起,我将它与另一个故障排除问题混淆了 - 可能是因为 在 VM 上进行了一些测试。对困惑感到抱歉。知道内核是否修复了某些东西仍然很有趣:) 再次为更新干杯
猜你喜欢
  • 1970-01-01
  • 2020-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多