一段时间后,连接在native-app和chrome-extension之间中断

时间:2014-01-30 09:32:03

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

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

连接建立得很好,数据也可以交换。但是,从扩展到本机应用程序的随机调用次数后,连接中断。

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

我的native-app在第一次调用时生成了近300KB的数据( encode_frame()),然后进行连续调用(每300 ms)生成0到300KB的数据( encode_frame_difference ())。数据是base64编码的。

仅供参考:通过本地应用和扩展之间的stdin和stdout进行通信。

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

以下是原生应用代码windows-native-app-cpp

以下是扩展程序代码chrome-extension-js

任何帮助将不胜感激!

谢谢。

修改: 直到现在我发现我发送的数据有一定的长度存在问题。

例如。如果JSON长度介于2560和2815之间,则它将停止工作。而对于JSON长度,如2816或6656,它可以工作。

1 个答案:

答案 0 :(得分:4)

我从铬扩展组获得了这个,它对我有用。

粘贴完全相同:

问题可能出在包含4字节长度的邮件的标头中。如果它很奇怪,Chrome将破坏连接。由于默认情况下stdout处于文本模式,因此某些ASCII字符可能会在Windows上转换为不同的字符,例如\ n变为\ r \ n。您最终会在标题中包含比您需要的字节更多的字节,因此Chrome扩展程序会认为您发送了数百万字节的数据,感到困惑,并且断开了连接,并且某些标头字节渗入了邮件中,导致JSON解析器遇到意外字符。

尝试将stdout设置为二进制模式:

_setmode(_fileno(stdout), _O_BINARY);

如果这没有帮助,您可以另外尝试这种写入stdout的替代方法:

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

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