c++ - boost 异步TCP服务器写入错误

标签 c++ boost asynchronous boost-asio

我有一个问题,我在客户端和服务器之间有一个 TCP 连接,当客户端初始化时,他向服务器发送一条消息,服务器通过欢迎消息回答。

所有这些在本地网络上都能正常工作。

所以我的问题是我使用了 async_write 和 async_read(因为我需要我的服务器是异步的) 我的客户端将消息发送到服务器,服务器看到它并回答但我的客户端从未收到欢迎消息。

否则,当我关闭服务器时,客户端会收到欢迎消息。

这是我的服务器代码:

主要.cpp

int main()
{
  try
  {
  boost::asio::io_service io_service;

  tcp_server server(io_service, 7171);
  io_service.run();
}
 catch (std::exception& e)
{
  std::cerr << e.what() << std::endl;
}

return 0;
}

tcp_服务器

class tcp_server
 {
  public:
 tcp_server(boost::asio::io_service& io_service, int port) // (1)                                                                                                                                                                            
   : m_acceptor(io_service, tcp::endpoint(tcp::v4(), port))
    {
      std::cout << "Port : " << port << std::endl;
      start_accept();
    }

 private:

  void start_accept()
  {
    tcp_connection::pointer new_connection = tcp_connection::create(m_acceptor.io_service());

    m_acceptor.async_accept(new_connection->socket(),
                            boost::bind(&tcp_server::handle_accept, this, new_connection,
                    boost::asio::placeholders::error));
  }

  void handle_accept(tcp_connection::pointer new_connection, const boost::system::error_code& error) // (4)                                                                                                                                  
  {
    if (!error)
      {
        std::cout << "Get one client!" << std::endl;
        new_connection->start();
        start_accept(); // (5)                                                                                                                                                                                                               
      }
  }


  tcp::acceptor m_acceptor;
};

tcp_connection

class tcp_connection : public boost::enable_shared_from_this<tcp_connection>
{
 public:
  typedef boost::shared_ptr<tcp_connection> pointer;

  static pointer create(boost::asio::io_service& ios)
  {
    pointer new_connection(new tcp_connection(ios) );
    return new_connection;
  }

  tcp::socket& socket()
    {
      return m_socket;
    }

  void do_read() // (1)                                                                                                                                                                                                                      
  {
    boost::asio::async_read(m_socket, boost::asio::buffer(m_buffer), // (3)                                                                                                                                                                  
                            boost::bind(&tcp_connection::handle_read, shared_from_this(),
                                        boost::asio::placeholders::error)
                            );
  }


  void start()
  {
    m_message = "Welcome on the server \n";

    boost::asio::async_write(m_socket, boost::asio::buffer(m_message),
                             boost::bind(&tcp_connection::handle_write, shared_from_this(),
                                         boost::asio::placeholders::error)
                             );
  }
private:
 tcp_connection(boost::asio::io_service& io_service)
   : m_socket(io_service)
      { }

  void handle_write(const boost::system::error_code& error)
  {
    std::cout << "handle_write : "<< m_message << std::endl;
    if (!error)
      do_read(); // (2)                                                                                                                                                                                                                      
    else
      std::cout << error.message() << std::endl;
  }

  void handle_read(const boost::system::error_code& error) // (6)                                                                                                                                                                            
  {
    std::cout << "handle read" << m_buffer.data() <<std::endl;
     if (!error)
        do_read();
    else
        close();
  }

 void close() // (7)                                                                                                                                                                                                                        
  {
    m_socket.close();
  }

  tcp::socket m_socket;
  std::string m_message;
  boost::array<char, 128> m_buffer;
};

我不明白为什么? 我怎样才能避免这种情况?

最佳答案

拜托async_read的说明书:

This function is used to asynchronously read a certain number of bytes of data from a stream. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:

  • The supplied buffers are full. That is, the bytes transferred is equal to the sum of the buffer sizes.
  • An error occurred.

在您的情况下,这 2 个条件都不满足 - 直到对等方关闭套接字。

您应该改用async_read_some(或async_read_until,但它可能有点复杂)。

关于c++ - boost 异步TCP服务器写入错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11504458/

相关文章:

C++ 应用程序构建时间/日期保存

c++ - 无法在 visual studio 2010 中使用函数 posix_memalign

c++ - 共享内存段是否跨 boost 版本和编译器版本兼容

android - 执行 AsyncTask 时启动画面显示空白屏幕

javascript - 如何改变一些元素异步使用jquery的位置

c++ - 从派生构造函数调用基类方法

c++ - 为什么 "possible lack of precision"不是编译器错误?

c++ - 来自 Boost 的 JSON 解析器的警告 C4512 的解决方法

c++ - 使用 OpenCV、Boost 线程和多个摄像头

c# - OperationCanceledException 和 TaskCanceledException 之间的区别?