4

我正在使用 chrome 原生消息传递 api 在我的 chrome-extension 和用 c++ 编写的 native-windows-app 之间进行通信。

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

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

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

仅供参考:本机应用程序和扩展程序之间通过标准输入和标准输出进行通信。

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

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

这是扩展代码chrome-extension-js

任何帮助,将不胜感激!

谢谢你。

编辑:直到现在我发现我发送的某些数据长度存在问题。

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

4

1 回答 1

4

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

粘贴完全相同:

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

于 2014-02-04T09:56:51.510 回答