Форум программистов, компьютерный форум, киберфорум
Boost C++
Войти
Регистрация
Восстановить пароль
 
2 / 2 / 3
Регистрация: 20.07.2015
Сообщений: 49
1

Asio ассинхронный клиент

26.12.2015, 02:10. Просмотров 682. Ответов 0
Метки нет (Все метки)


Доброго времени суток!
На данный момент занимаюсь освоением библиотеки asio. Пишу простейший ассинхронный клиент: обычная консольная программа, которая должна отправлять сообщения на сервер. Возник вопрос. Как организовать ввод? Ведь при вызове std::cin программа блокируется, что не допустимо при ассинхронной работе.
Была идея организовать ввод в другом потоке(std::thread).
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
std::thread threadSession([&sMessage]()
    {
        asio::io_service io_service;
        io_service.post([]{});
        Session session(io_service, sMessage, "127.0.0.1", 20001);
        session.Start();
    });
    
    
    while (true)
    {
        std::cout << ": ";
        std::string sTemp;
        std::cin >> sTemp;
        sMessage = sTemp;
 
        if (sMessage == ":q")
            break;
    }
Сам класс Session имеет следующие методы:
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
void Session::Start()
{
    Connect();
    io_service_.run();
}
 
void Session::Connect()
{
    //auto pSocket = std::make_shared<sock_ptr>(io_service_);
    socket.async_connect(endpoint, [this](asio::error_code const &err)
    {
        if (!err)//если удалось подключиться
        {
            WriteMessage();
        }
 
        Connect();
    });
}
 
void Session::WriteMessage()
{
    socket.async_send(asio::buffer(sMessage_, 512), [this](asio::error_code const &err, const size_t bytes)
    {
        if (bytes > 0)
        {
            sMessage_.clear();
        }
 
        WriteMessage();
    });
}
Собственно, я понимаю, что есть вероятность затереть сообщение, если клиент не смог его отправить, а пользователь уже ввел следующие.
Подскажите, есть ли возможность как-то контролировать ввод из потока? Так, чтобы метод отправки сообщения вызывался только после его ввода в потоке main?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.12.2015, 02:10
Ответы с готовыми решениями:

Асинхронный сервер и клиент Boost Asio
Здравствуйте. Попробовал написать нечто такое. Но на этом этапе чтения не происходит ничего. Дальше...

Клиент с использованием boost::asio
Пытаюсь написать клиентское приложение, которое общается с сервером, однако проблема заключается в...

Boost::Asio клиент - сервер: При вводе с телнета на стороне сервера появляется куча крякозябр
Раньше использовал Code::Blocks и winsock. Сейчас решил попробовать VS2013 и библиотеку boost::asio...

Ассинхронный запуск дополнительной формы
Всем доброго времени суток, Помогите пожалуйста разобраться с проблемой: У меня есть Основная...

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.12.2015, 02:10

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Как реализовать ассинхронный вызов сокетов?
Собственно вопрос в заголовке)

Ассинхронный вызов блокирует программу программу
Нашел такой пример на одном сайте static void Main(string args) { ...

asio
Здравствуйте, хочу спросить у вас совета, дело вот в чем у меня есть асинхронные операции.......

Asio, g++
Не компилируется проект. Код: #include &lt;boost/asio.hpp&gt; #include &lt;iostream&gt; #include...

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

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


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

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

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