簡體   English   中英

Boost :: asio阻止Tcp服務器混亂

[英]Boost::asio Blocking Tcp Server confusion

在過去的5個小時左右的時間里,我一直陷在這個困境中。.很抱歉,如果這個問題太明顯/新手,但對於boost :: asio或tcp / ip來說,我本人也不是。

所以這就是問題所在。 我正在嘗試修改阻塞的TCP服務器示例

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_someread_some調用。 在調試器中,控件永遠不會在循環外轉到write方法。 我可能做錯了什么。 但是我不知道是什么。

附帶問題:

在某些UI和后端進程之間建立套接字連接的最簡單解決方案是什么?

它可能掛起,因為客戶端等待服務器回復並且不發送新數據。

此外,僅當連接關閉且無處write數據時,服務器才會退出表單循環。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM