【问题标题】:Garbage value in Boost::Array using with Boost::AsioBoost::Array 中的垃圾值与 Boost::Asio 一起使用
【发布时间】:2015-09-12 00:14:33
【问题描述】:

客户正在这样

    std::string line;
    std::cin>>line;      
    boost::asio::write(socket, boost::asio::buffer(line));


服务器正在读取这样

void reader(){   
           socket_.async_read_some(boost::asio::buffer(buf),
           boost::bind(&tcp_connection::handle_read,shared_from_this()));     
  }
void handle_read()
    {
          std::cout.write(buf.data(),1024);
          std::cout<<"\n";
    }
  tcp::socket socket_;
  boost::array<char, 1024> buf;


现在当我从客户端写一行“你好,你好吗”时,它只是打印“你好”,然后是垃圾值
这是服务器显示的输出:

helloA0�B��B�����a�Pa�!0�B�b����uB�`�#K|BP�b��D4B���Bb�Pa���e��e�����pc�!0�Be���xB�`�#KcBe�:7B�����e��e���  


如何删除这些垃圾值并从客户端获取完整的消息/行

【问题讨论】:

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


    【解决方案1】:

    你有三个问题:

    首先,无论您实际读取了多少数据,您都从缓冲区写入 1024 字节。

    其次,TCP 连接是流式传输,这意味着没有消息边界,这导致单个接收调用可能会比发送的要少,并且您需要多个接收才能收到完整的消息。

    第三,其他人回答,输入操作符没有按你的预期工作。

    【讨论】:

      【解决方案2】:

      &gt;&gt; just reads up to the first delimiter,在你的情况下是一个空格。

      你的另一个问题是你没有告诉你的接收者你的信息会持续多久。

      【讨论】:

        【解决方案3】:
        1. operator &gt;&gt; 使用空格作为分隔符,如scanf()。你应该使用std::getline()

          std::getline(std::cin, line);
          
        2. 你为什么使用cout.write()?只需使用operator &lt;&lt;

          std::cout << buf.data();
          

          当然,你应该关心'\0'-terminate。 boost.asio 可能会将接收到的字节大小提供给您的处理程序。

        【讨论】:

        • 因为 2 而出现垃圾。你写了 1024 个字节,远远超过你的消息。
        • @tsv.dimitrov 这就是为什么他应该关心'\0'
        • 我认为 std::cout.write() 总是会写入 count (第二个参数)字节数,不管有没有\0。
        • @tsv.dimitrov 所以我说 OP 应该使用 operator &lt;&lt;,不是吗?
        • 你做了,但这并不能解释输出中的垃圾,对吧?
        猜你喜欢
        • 2023-04-07
        • 2018-04-09
        • 2012-10-01
        • 2018-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-07
        相关资源
        最近更新 更多