c++ - 简单的 websockets 聊天客户端不发送消息

标签 c++ visual-c++

我正在尝试使用 websockets 编写一个简单的聊天客户端,到目前为止我的代码可以找到 here .如果我以编程方式发送 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 服务器与第三方客户端(谷歌浏览器扩展)一起工作正常。看起来好像消息正在被缓冲,但即使退出程序,它们也不会被发送。

我正在使用图书馆 websocketpp并在 Visual Studio Community 2017 下编译

有什么线索吗?

最佳答案

ASIO 是A同步的。这意味着您不能阻止它调用的回调。如果您阻塞,则不会触发更多回调,因为所有回调都在同一线程上运行。这意味着您在 on_open 中的 while 循环阻止 ASIO 处理任何进一步的消息或为发送您的消息做任何进一步的工作。

您需要找到一种方法来从cin 中异步读取您的套接字。可能最好的方法是不使用 cin 而是使用适当的特定于平台的 asynchronous stream由 ASIO 提供。例如,在 Linux 上您可以使用 posix::stream_descriptor在文件描述符 0 上。

另一种方法是继续使用 cin 但来自另一个线程。您可以启动一个从 cin 读取的线程,然后通过 c.get_io_service().post(func) 将消息发布到主 ASIO 线程。

关于c++ - 简单的 websockets 聊天客户端不发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50276375/

相关文章:

c++ - 简单的 std::regex_search() 代码无法使用 Apple clang++ -std=c++14 编译

c++ - 用于主机循环的 CUDA bool 变量

c++ - uint8 显示奇怪的字符

c++ - 通过 tcp 构造 char*

javascript - 我的 C++ 代码比 JavaScript 代码慢很多

c++ - 选择字体对话框 : munges font name fails to reload it

c++ - 简单模板推导错误

c++ - stringstream object() 和 object 有什么区别?

c++ - 在 C++ 控制台应用程序中打印字符串资源(字符串表)

c++ - 在 Visual C++ 中使用 GTK+