Простой клиент чата websockets не отправляет сообщения - PullRequest
0 голосов
/ 10 мая 2018

Я пытаюсь написать простой чат-клиент с использованием веб-сокетов, мой код пока можно найти здесь .Если я программно отправляю 2 или более сообщений, это работает, но как только я пытаюсь дождаться пользовательского ввода, сообщения не уходят:

// This works
std::string message1 = "cpp1";
c->send(hdl, message1, websocketpp::frame::opcode::text);

std::string message2 = "cpp2";
c->send(hdl, message2, websocketpp::frame::opcode::text);

Программа должна принимать пользовательский ввод, поэтому я попытался:

do {
    std::cout << "What should I tell the ws?";
    std::getline(std::cin, input);
    if (input == "exit") {
        keep_running = false;
    }
    else {
        c->send(hdl, input, websocketpp::frame::opcode::text);
        std::cout << "Told ws " << input;
    }

} while (keep_running);

Это фактически показывает сообщение "Told ws", но сервер ws не получает сообщение.Я подтвердил, что сервер ws отлично работает со сторонним клиентом (расширение Google Chrome).Похоже, что сообщения буферизуются, но даже при выходе из программы они не отправляются.

Я использую библиотеку websocketpp и компилирую в Visual Studio Community 2017

Любая подсказка?

1 Ответ

0 голосов
/ 10 мая 2018

A SIO синхронно A .Это означает, что вы не можете заблокировать обратный вызов, который он вызывает.Если вы заблокируете, никакие обратные вызовы не будут запущены, потому что все обратные вызовы выполняются в одном потоке.Это означает, что ваш цикл while в on_open не позволяет ASIO обрабатывать любые дальнейшие сообщения или выполнять дальнейшую работу по отправке вашего сообщения.

Вам нужно будет найти способ читать из cin асинхронно относительнок вашей розетке.Вероятно, лучшим способом было бы не использовать cin, а вместо этого использовать соответствующий платформенный асинхронный поток , предоставляемый ASIO.Например, в Linux вы можете использовать posix :: stream_descriptor для файлового дескриптора 0.

Другим способом было бы продолжать использовать cin, но из другого потока.Вы можете запустить поток, который читает с cin, а затем отправляет сообщение в основной поток ASIO через c.get_io_service().post(func).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...