从客户端接收数据时出现异常 - "End of file"错误

Exception while receiving data from client - "End of file" error

本文关键字:异常 End of 错误 file 客户端 客户 端接 数据      更新时间:2023-10-16

我目前正在使用Boost ASIO的客户端服务器TCP/IP应用程序。客户端使用以下语句

向服务器发送数据
boost::system::error_code ignored_error; 
boost::asio::write(socket, boost::asio::buffer("Hello World"), ignored_error);

服务器读取这些数据(从异步)。读)

boost::asio::async_read(*sock, boost::asio::buffer(buf_server),boost::bind(&ServerRead,boost::asio::placeholders::error));

这里是读取的地方

boost::array<char, 158> buf_server;
void ServerRead(const boost::system::error_code& error)
{
    if(!error)
    {
        std::cout << "Message: " << buf_server.data() << std::endl;
    }
    else
    {
        std::cout << "Error occurred." << error.message() << std::endl;
    }
}

然而,我得到错误"文件结束"。现在我有两个问题

  1. 如何解决这个问题?

  2. 假设我的buf_server只有5个字符而不是158个字符。我怎么能让我的接收器使用这个缓冲区只读取整个数据和std::cout它?

当您指示应用程序读取158个字节但只发送12个字节时,应该会出现这种行为。要解决这个问题,您可以发送一个固定大小的头,指示消息大小,Asio文档中包含的聊天客户端和服务器示例展示了如何实现这一点,这是客户端示例的摘录:

void handle_connect(const boost::system::error_code& error)
  {
    if (!error)
    {
      boost::asio::async_read(socket_,
          boost::asio::buffer(read_msg_.data(), chat_message::header_length),
          boost::bind(&chat_client::handle_read_header, this,
            boost::asio::placeholders::error));
    }
  }
  void handle_read_header(const boost::system::error_code& error)
  {
    if (!error && read_msg_.decode_header())
    {
      boost::asio::async_read(socket_,
          boost::asio::buffer(read_msg_.body(), read_msg_.body_length()),
          boost::bind(&chat_client::handle_read_body, this,
            boost::asio::placeholders::error));
    }
    else
    {
      do_close();
    }
  }
  void handle_read_body(const boost::system::error_code& error)
  {
    if (!error)
    {
      std::cout.write(read_msg_.body(), read_msg_.body_length());
      std::cout << "n";
      boost::asio::async_read(socket_,
          boost::asio::buffer(read_msg_.data(), chat_message::header_length),
          boost::bind(&chat_client::handle_read_header, this,
            boost::asio::placeholders::error));
    }
    else
    {
      do_close();
    }
  }

或者使用更奇特的协议,例如HTTP,在那里您读取直到遇到rn分隔符。