Boost :: asio Блокировка Tcp сервера путаница - PullRequest
1 голос
/ 13 декабря 2011

Я застрял с этой проблемой в течение последних 5 часов или около того .. Извините, если вопрос слишком очевиден / noob, но я сам noob, когда дело доходит до 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_some вызывается более одного раза.В отладчике элемент управления никогда не переходит к методу write вне цикла.Я, вероятно, делаю что-то очень неправильно.Но я не могу выяснить, что.

Дополнительный вопрос:

Каким было бы самое простое решение, чтобы иметь сокетное соединение между некоторым пользовательским интерфейсом и внутренним процессом?

1 Ответ

1 голос
/ 13 декабря 2011

Возможно, он зависает, потому что клиент ожидает ответа сервера и не отправляет новые данные.

Кроме того, сервер выйдет из цикла формы только тогда, когда соединение закрыто, и write данных некуда.

...