Форум программистов, компьютерный форум, киберфорум
Наши страницы
Boost C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
OlafSvenson
0 / 0 / 0
Регистрация: 12.02.2015
Сообщений: 1
1

Работа с boost::asio::streambuf

12.02.2015, 15:44. Просмотров 1279. Ответов 1
Метки нет (Все метки)

Для знакомства с boost::asio (да и с самим boost) решил написать асинхронный сервер. Для хранения входящих данных используется boost::asio::streambuf.
Тут возникают несколько проблем. При получении второго сообщения от клиента и последущих я вижу, что в буффере лежат данные от предыдущих сообщений.
Хотя я вызываю consume у входного буффера после обработки сообщения. Что не так?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
class tcp_connection
    // Using shared_ptr and enable_shared_from_this 
    // because we want to keep the tcp_connection object alive 
    // as long as there is an operation that refers to it.
    : public boost::enable_shared_from_this<tcp_connection>
{
        ...
    boost::asio::streambuf receive_buffer;
 
    boost::asio::io_service::strand strand;
}
 
...
void tcp_connection::receive()
{
    // Read the response status line. The response_ streambuf will
    // automatically grow to accommodate the entire line. The growth may be
    // limited by passing a maximum size to the streambuf constructor.
    boost::asio::async_read_until(m_socket, receive_buffer, "\r\n",
        strand.wrap(boost::bind(&tcp_connection::handle_receive, shared_from_this()/*this*/,
        boost::asio::placeholders::error,
        boost::asio::placeholders::bytes_transferred)));
 
}
 
 
void tcp_connection::handle_receive(const boost::system::error_code& error, std::size_t bytes_transferred)
{
    
    if (!error)
    {
        // обрабатываем данные
 
        /*  boost::asio::async_read_until remarks
 
        After a successful async_read_until operation, the streambuf may contain additional data beyond the delimiter.
        An application will typically leave that data in the streambuf for a subsequent async_read_until operation to examine.
        */
 
        // Поэтому считаем построчно
    
        std::istream is(&receive_buffer);
        std::string line;
        std::getline(is, line); // это не работает
        
        // очищаю столько данных, сколько принял, но это не работает
        receive_buffer.consume(bytes_transferred);  
 
        receive(); // в конце начинаем заново для того, чтобы io_service.run() никогда не заканчивался
 
    }
    else if (error != boost::asio::error::operation_aborted)
    {
        std::cout << "Client Disconnected\n";
 
        m_connection_manager.remove(shared_from_this());
    }
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.02.2015, 15:44
Ответы с готовыми решениями:

boost::asio работа с файлами
Здравствуйте. Есть ли у когонибудь рабочий пример приема\передачи файлов через asio по сети(синхрон...

Boost Asio C++
Добрый день. Юзаю этот ( http://www.boost.org/ ) проект. Нужна помощь с документаций...

Boost.asio
Добрый день. Я только начал знакомство с boost.asio и при использовании примеров с офф.сайта...

boost/asio
Кто тестил asio в Вuilder-е? Код использовал отсюда...

boost::asio
начал ковырять буст. Возник вопрос с созданием клинт-серверного приложения. Для ознакомления хочу...

1
Nosey
1376 / 403 / 144
Регистрация: 22.10.2014
Сообщений: 872
Завершенные тесты: 2
13.02.2015, 23:19 2
Судя по мануалам и моим мыслям вот такое должно помочь.

C++
1
2
3
4
5
        // Поэтому считаем построчно
        receive_buffer.commit(bytes_transferred);
        std::istream is(&receive_buffer);
        // и после очищаем инпут в потоке.
        receive_buffer.consume(bytes_transferred);
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.02.2015, 23:19

boost::asio cессии
Здравствуйте. Хотелось бы узнать ответ на вопрос, который не где не нашол. Сервер реализован на...

C++ | boost::asio + ssl?
Доброго времени суток! Хотелось бы узнать как подключаться по SSL? int main() { ...

Boost.Asio не соединяется
Здравствуйте форумчане, недавно начал изучать boost.asio Скомпилил из примеров Server Client,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru