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

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

本文关键字:Boost Asio 一起 数组      更新时间:2023-10-16

客户端正在这样写

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


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

  1. operator >>scanf()一样使用空白作为分隔符。您应该使用std::getline()

    std::getline(std::cin, line);
    
  2. 为什么使用cout.write()?只需使用CCD_ 5。

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

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

您有三个问题:

首先,不管实际读取了多少数据,都要从缓冲区中写入1024字节。

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

第三,输入操作符并没有像你期望的那样工作。

>>只读取第一个分隔符,在您的情况下是一个空格。

你的另一个问题是,你没有告诉你的接收者你的消息会有多长。