Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何解决通过boost websocket无法将文本帧解码为UTF 8的问题_Javascript_Google Chrome_Boost_Beast Websockets - Fatal编程技术网

Javascript 如何解决通过boost websocket无法将文本帧解码为UTF 8的问题

Javascript 如何解决通过boost websocket无法将文本帧解码为UTF 8的问题,javascript,google-chrome,boost,beast-websockets,Javascript,Google Chrome,Boost,Beast Websockets,我通过boost编写websocket,并通过chrome中的客户端接收消息。 当我使用ws时,它运行良好,我可以收到正确的消息。 但当我使用wss时,它的效果很差,并且说无法将文本帧解码为UTF8 图中显示的是ssl模式的错误。 c++发送消息代码 Json::Value jsonMsg; jsonMsg["msgType"] = Json::Value("MspServiceStartUp"); jsonMsg["version"] = Json::Va

我通过boost编写websocket,并通过chrome中的客户端接收消息。 当我使用ws时,它运行良好,我可以收到正确的消息。 但当我使用wss时,它的效果很差,并且说无法将文本帧解码为UTF8

图中显示的是ssl模式的错误。

c++发送消息代码

  Json::Value jsonMsg;
        jsonMsg["msgType"] = Json::Value("MspServiceStartUp");
        jsonMsg["version"] = Json::Value(std::string(MSP_VERSION));
        ws_->async_write(boost::asio::buffer((void *) jsonMsg.toStyledString().data(), jsonMsg.toStyledString().size()),
                         boost::asio::bind_executor(*strand_, [&, sp](boost::system::error_code ec1,
                                                                      std::size_t bytes_transferred1) {
                             boost::ignore_unused(bytes_transferred1);
                             if (ec1) {
                                 LOG_ERR << "async write failed, ec = " << ec1 << ", msg = "
                                         << ec1.message();
                                 return;
                             }
                             // Clear the buffer
                             buffer_->consume(buffer_->size());
                             task();
                         }));
    }
这个奇怪的角色来自哪里?
有什么问题?如何解决此问题?

问题在于发送数据
async_write()
立即结束,它不会复制数据缓冲区,您必须确保传递到
boost::asio::buffer
的数据在发送完整消息之前一直有效

即使我们在
async_write
和结束括号
{
之间添加了一些延迟代码:

async_write(boost::asio::buffer((void *) jsonMsg.toStyledString().data(), ..));
... some code waiting until write is completed
}
此代码也不起作用,因为
toStyledString
按值返回
string
。 因此,创建了临时的
string
,调用了
string::data()
async\u write()
结束,并且您在由
async\u write()
启动的任务中有悬空指针

快速解决方案,例如通过使用智能指针延长字符串的生存期:

std::shared_ptr<std::string> buf(std::make_shared<std::string>(jsonMsg.toStyledString()));
ws_->async_write(boost::asio::buffer(*buf),
                 boost::asio::bind_executor(*strand_, 
                 [&, sp, buf](boost::system::error_code ec1,
                             std::size_t bytes_transferred1) 
                 {
                         boost::ignore_unused(bytes_transferred1);
                         if (ec1) {
                             LOG_ERR << "async write failed, ec = " << ec1 << ", msg = "
                                     << ec1.message();
                             return;
                         }
                         // Clear the buffer
                         buffer_->consume(buffer_->size());
                         task();
                 }));
std::shared_ptr buf(std::make_shared(jsonMsg.toStyledString());
异步写入(boost::asio::buffer(*buf),
boost::asio::bind_执行器(*strand_u),
[&,sp,buf](boost::system::error_code ec1,
std::大小\u t字节\u传输1)
{
boost::ignore_unused(字节_transferred1);
如果(ec1){

LOG\u ERR问题在于发送数据。
async\u write()
立即结束,它不会复制数据缓冲区,您必须确保传递到
boost::asio::buffer
的数据在发送完整消息之前一直有效

即使我们在
async_write
和结束括号
{
之间添加了一些延迟代码:

async_write(boost::asio::buffer((void *) jsonMsg.toStyledString().data(), ..));
... some code waiting until write is completed
}
此代码也不起作用,因为
toStyledString
按值返回
string
。 因此,创建了临时的
string
,调用了
string::data()
async\u write()
结束,并且您在由
async\u write()
启动的任务中有悬空指针

快速解决方案,例如通过使用智能指针延长字符串的生存期:

std::shared_ptr<std::string> buf(std::make_shared<std::string>(jsonMsg.toStyledString()));
ws_->async_write(boost::asio::buffer(*buf),
                 boost::asio::bind_executor(*strand_, 
                 [&, sp, buf](boost::system::error_code ec1,
                             std::size_t bytes_transferred1) 
                 {
                         boost::ignore_unused(bytes_transferred1);
                         if (ec1) {
                             LOG_ERR << "async write failed, ec = " << ec1 << ", msg = "
                                     << ec1.message();
                             return;
                         }
                         // Clear the buffer
                         buffer_->consume(buffer_->size());
                         task();
                 }));
std::shared_ptr buf(std::make_shared(jsonMsg.toStyledString());
异步写入(boost::asio::buffer(*buf),
boost::asio::bind_执行器(*strand_u),
[&,sp,buf](boost::system::error_code ec1,
std::大小\u t字节\u传输1)
{
boost::ignore_unused(字节_transferred1);
如果(ec1){

LOG_ERR我不明白它是如何工作的。首先
toStyledString
按值返回字符串,因此在
data()之后
您有悬空指针。其次,
async_write
会立即返回,以便在发送消息之前销毁jsonMsg。我不知道它是如何工作的。首先
toStyledString
按值返回字符串,因此影响
数据()
你有一个悬空的指针。其次,
async_write
会立即返回,以便在消息发送之前销毁jsonMsg。兄弟,我必须感谢你,这解决了我的问题,但我还没有弄清楚。如果这是错误的,为什么它在所有计算机的WS中都能很好地工作,在WSS中,除了一个之外,它在大多数同学的设备中都能很好地工作。它很难说它为什么能工作。你的原始代码中的问题引入了未定义的行为。有了UB,一切都可能发生,甚至代码看起来也能工作,但这只是个幸运的机会。因为WS比WSS快得多,所以I/O在临时超出范围之前完成。兄弟,我必须感谢你,这解决了我的问题,但我还没有完成如果这是错误的,为什么它在所有计算机的WS中都能很好地工作,在WSS中,它在我们同学的大多数设备中都能很好地工作,除了一个。很难说为什么它能工作。你的原始代码中的问题引入了未定义的行为。在UB中,一切都可能发生,甚至代码看起来都能工作,但这只是幸运的突破。因为WS在很大程度上是f比WSS更高级,因此I/O在临时文件超出范围之前完成。