Nano Hash - криптовалюты, майнинг, программирование

boost :: asio :: async_read_until проблема с разделителем строки чтения

Я адаптирую пример клиента чата asio из здесь для связи с существующим клиентским приложением, которое публикует данные на основе строк. Вот мой код:

#include <cstdlib>
#include <deque>
#include <iostream>
#include <boost/bind.hpp>
#include <boost/asio.hpp>
#include <boost/thread/thread.hpp>
#include <boost/thread/mutex.hpp>

boost::mutex global_stream_lock;
using boost::asio::ip::tcp;
typedef std::deque<std::string> simple_message_queue; 

class chat_client
{
public:
    chat_client(boost::asio::io_service& io_service,
                tcp::resolver::iterator endpoint_iterator)
    : io_service_(io_service),
    socket_(io_service)
    {
        if(DEBUGGING) std::cout << "[" << __FUNCTION__ << "]" << std::endl;
        boost::asio::async_connect(socket_, endpoint_iterator,
                                   boost::bind(&chat_client::handle_connect, this,
                                               boost::asio::placeholders::error));
    }

    void write(const std::string& i_msg)
    {
        io_service_.post(boost::bind(&chat_client::do_write, this, i_msg));
    }

    void close()
    {
        io_service_.post(boost::bind(&chat_client::do_close, this));
    }

private:

    void handle_connect(const boost::system::error_code& error)
    {
        if (!error)
        {
            boost::asio::async_read_until(socket_, simple_msg_buf_, "\n",
                                          boost::bind(&chat_client::handle_read_message, this,
                                                      boost::asio::placeholders::error,
                                                      boost::asio::placeholders::bytes_transferred));
        }
    }

    void handle_read_message(const boost::system::error_code& error, std::size_t bytes_transferred)
    {
        if (!error && bytes_transferred) 
        {
            // Remove newline from input.
            simple_msg_buf_.commit(bytes_transferred);

            std::istream is(&simple_msg_buf_);
            std::string s;
            is >> s;

            std::cout << s << std::endl;

            boost::asio::async_read_until(socket_, simple_msg_buf_, "\n",
                                        boost::bind(&chat_client::handle_read_message, this,
                                                    boost::asio::placeholders::error,
                                                    boost::asio::placeholders::bytes_transferred));
        }
        else
        {
            do_close();
        }
    }

    void do_close()
    {
        socket_.close();
    }

private:
    boost::asio::io_service& io_service_;
    tcp::socket socket_;
    boost::asio::streambuf simple_msg_buf_;
    simple_message_queue write_simple_msgs;
};

int main(int argc, char* argv[])
{
    try
    {
        boost::asio::io_service io_service;
        tcp::resolver resolver(io_service);
        tcp::resolver::query query("127.0.0.1", "20001");
        tcp::resolver::iterator iterator = resolver.resolve(query);

        chat_client c(io_service, iterator);

        boost::thread t(boost::bind(&boost::asio::io_service::run, &io_service));

        std::string input;
        while(std::cin)
        {
            std::getline(std::cin,input);

            // do something with input...
        }

        c.close();
        t.join();
    }
    catch (std::exception& e)
    {
        std::cerr << "Exception: " << e.what() << "\n";
    }

    return 0;
}

У меня нет проблем со связью с сервером, но формат получаемых данных не тот, который должен быть. Я хочу анализировать данные построчно, поэтому я использую разделитель "\n", как я делаю это в Mac OS X (Intel). Например, предположим, что я ожидаю данные в формате: This:(IS SOME) data; то, что я действительно получаю с приведенным выше кодом, имеет форму:

This:(IS
SOME)
data

Таким образом, похоже, что символ "\n" обрабатывается так же, как пробел (" "). Фактически, если я заменю разделитель "\n" на " ", поведение останется таким же. Я также пробовал "\r" и "\r\n", но ни один из шаблонов не уловил.

Кто-нибудь знает, что может быть причиной этого?


  • Примеры адресов async_timeout_tcp план проблемы выше ... 08.02.2012
  • Также обсуждается здесь 08.02.2012

Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..