gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 04:40:27 25 4
gpt4 key购买 nike

我正在尝试使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com