Boost::Array 中的垃圾值与 Boost::Asio 一起使用

Garbage value in Boost::Array using with Boost::Asio

客户是这样

    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;


现在当我从客户端写一行 "hello how are you" 时,它只是打印 "hello" 然后是垃圾值
这是服务器显示的输出:

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���  


如何删除这些垃圾值并从客户端

获得完整的 message/line
  1. operator >>scanf() 一样使用空格作为分隔符。你应该使用 std::getline().

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

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

    当然,你应该关心'[=17=]'-终止。可能 boost.asio 将接收到的字节大小提供给您的处理程序。

>> just reads up to the first delimiter,在你的情况下是 space。

你的另一个问题是你没有告诉你的接收者你的消息将持续多长时间。

你遇到了三个问题:

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

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

第三,其他人回答,输入运算符没有按您预期的那样工作。