javascript - native 应用程序和 chrome-extension 之间的连接在一段时间后中断

标签 javascript c++ visual-c++ google-chrome-extension chrome-native-messaging

我正在使用 chrome native messaging api 在我的 chrome-extension 和用 c++ 编写的 native-windows-app 之间进行通信。

连接建立良好,数据也得到交换。但是在从扩展到 native 应用程序进行随机数量的调用后连接中断。

我尝试独立运行 native-app,在无限循环中运行时它工作正常(没有发生异常)。

我的本​​机应用程序在第一次调用 (encode_frame()) 时生成近 300KB 的数据,然后连续调用(每 300 毫秒)生成 0 到 300KB 的数据(encode_frame_difference ()).数据采用 base64 编码。

仅供引用: native 应用程序和扩展程序之间通过标准输入和标准输出进行通信。

问题是我无法弄清楚为什么连接会在一段时间后中断。

这是 native 应用程序代码: windows-native-app-cpp

这是扩展代码: chrome-extension-js

如有任何帮助,我们将不胜感激!

谢谢。

编辑: 直到现在我发现我发送的特定长度的数据有问题。

例如。如果 JSON 长度在 2560 到 2815 之间,它将停止工作。而对于像 2816 或 6656 这样的 JSON 长度,它是有效的。

最佳答案

我从 chromium-extension group 得到了这个,它对我有用。

粘贴完全相同的内容:

问题可能出在包含消息的四字节长度的 header 中。如果很奇怪,Chrome 会断开连接。由于 stdout 默认处于文本模式,某些 ASCII 字符可能会在 Windows 上转换为不同的字符,例如\n 变为\r\n。您最终会在 header 中获得比您需要的字节更多的字节,因此 Chrome 扩展程序会认为您正在发送数百万字节的数据,感到困惑并中断连接,一些 header 字节会渗入消息中,从而导致JSON 解析器遇到意外字符。

尝试将标准输出设置为二进制模式:

_setmode(_fileno(stdout), _O_BINARY);

如果这没有帮助,您还可以尝试这种写入标准输出的替代方法:

unsigned int len = final_msg.length();
fwrite(&len, 4, 1, stdout);
printf("%s", final_msg.c_str());
fflush(stdout);

您可能需要添加一些包括: fcntl.h io.h

关于javascript - native 应用程序和 chrome-extension 之间的连接在一段时间后中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21452483/

相关文章:

javascript - JS : How do I strip unwanted code from the end of a string?

C++堆叠列表推送功能打印下一个/上一个元素

python - 将C++类序列化为文件,然后在Python中基于事件的反序列​​化?

c++ - Visual C++ 2012:编译器提示“缺少';'”

javascript - 我可以在 Grunt 中运行两次 'min' 任务吗?

javascript - 如何修改JSON对象?

javascript - 使用 D3.js 将每五个 svg 元素包装在一个 div 中

c++ - 这个 AnonymousClass(variable) 声明中到底发生了什么?

c++ - 构造函数名称前的关键字 struct

c++ - 这两个C++片段之间有什么区别?