在过去的5个小时左右的时间里,我一直陷在这个困境中。.很抱歉,如果这个问题太明显了/新手,但是对于boost::asio或tcp / ip来说,我本人是新手。

所以这就是问题所在。我正在尝试修改blocking tcp server example:

void session(socket_ptr sock)
{
  try
  {
    for (;;)
    {
      char data[max_length];

      boost::system::error_code error;
      size_t length = sock->read_some(boost::asio::buffer(data), error);
      if (error == boost::asio::error::eof)
        break; // Connection closed cleanly by peer.
      else if (error)
        throw boost::system::system_error(error); // Some other error.

      boost::asio::write(*sock, boost::asio::buffer(data, length));
    }
  }
  catch (std::exception& e)
  {
    std::cerr << "Exception in thread: " << e.what() << "\n";
  }
}

我想做的就是将所有块或read_some方法保存到此示例std::string的某个缓冲区中,然后在发送回信之前对它们进行一些处理:
const int max_length = 10;

typedef boost::shared_ptr<tcp::socket> socket_ptr;

void session(socket_ptr sock)
{
    std::string dataReceived = "";
    try
    {
        for (;;)
        {
            char data[max_length] = {'\0'};
            boost::system::error_code error;
            size_t length = sock->read_some(boost::asio::buffer(data), error);
            dataReceived += std::string(data, length);
            if (error == boost::asio::error::eof)
                break; // Connection closed cleanly by peer.
            else if (error)
                throw boost::system::system_error(error); // Some other error.
            //boost::asio::write(*sock, boost::asio::buffer(&dataReceived[0], dataReceived.size()));
        }
        boost::asio::write(*sock, boost::asio::buffer(&dataReceived[0], dataReceived.size()));
    }
    catch (std::exception& e)
    {
        std::cerr << "Exception in thread: " << e.what() << "\n";
    }
}

当我从循环内部删除write时,客户端挂起。 dataReceived内部包含所有数据。缓冲区故意较小,因此read_some被多次调用。在调试器中,控件永远不会在循环外转到write方法。我可能做错了什么。但是我不知道是什么。

附带问题:

在某些UI和后端进程之间建立套接字连接的最简单解决方案是什么?

最佳答案

它可能挂起,因为客户端等待服务器回复并且不发送新数据。

另外,仅当连接关闭并且没有write数据时,服务器才会退出表单循环。

10-08 06:59
查看更多