【问题标题】:Boost::asio Blocking Tcp Server confusionBoost::asio 阻塞 Tcp 服务器混乱
【发布时间】:2012-01-19 08:36:54
【问题描述】:

在过去的 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 和后端进程之间建立套接字连接的最简单解决方案是什么?

【问题讨论】:

    标签: c++ boost boost-asio


    【解决方案1】:

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

    另外,服务器只有在连接关闭时才会退出表单循环,并且write数据无处可去。

    【讨论】:

    • 是的,但这并不能解决问题。为什么for循环外的write不执行?
    • @FailedDev,看看你的循环。您的服务器读取一些数据并等待直到另一个数据到达。循环仅在客户端断开连接时终止,write 将永远不会在有效套接字上执行。
    • 那么我怎么能做我想做的事,那就是把所有的数据拿走,直到没有剩下的数据,用它做点什么,然后写回去?这个例子不可能吗?不过感谢您的帮助。 +1
    • @FailedDev,您应该在您的协议中定义“无剩余”条件。也许客户端应该发送一个“没有剩下”的指示符,比如零字节。
    • 谢谢。您的提示给了我正在寻找的解决方案。我最终使用了 read_until 等。就像一个魅力!谢谢!
    猜你喜欢
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-11
    相关资源
    最近更新 更多