4

C++ で記述された Chrome 拡張機能とネイティブ Windows アプリの間で通信するために、Chrome ネイティブ メッセージング API を使用しています。

接続はうまく確立され、データも交換されます。ただし、拡張機能からネイティブ アプリへの呼び出しがランダムに行われると、接続が切断されます。

native-app を個別に実行してみましたが、無限ループで実行すると正常に動作します (例外は発生しません)。

私のネイティブ アプリは、最初の呼び出し ( encode_frame() ) でほぼ 300 KB のデータを生成し、その後 (300 ミリ秒ごとに) 0 ~ 300 KB のデータを生成する連続呼び出しが行われます ( encode_frame_difference() )。データは base64 でエンコードされています。

参考: 通信は、ネイティブ アプリと拡張機能の間で stdin と stdout を介して行われます。

問題は、しばらくして接続が切断された理由を理解できないことです。

ネイティブアプリのコードは次のとおりです: windows-native-app-cpp

拡張コードは次のとおりです: chrome-extension-js

どんな助けでも大歓迎です!

ありがとうございました。

編集:今まで、送信している特定の長さのデータに問題があることがわかりました。

例えば。JSON の長さが 2560 ~ 2815 の場合、機能しなくなります。一方、2816 や 6656 などの JSON の長さでは機能します。

4

1 に答える 1

4

これはクロム拡張グループから入手しましたが、うまくいきます。

まったく同じものを貼り付けます:

問題は、メッセージの 4 バイト長を含むヘッダーにある可能性があります。変な場合、Chrome は接続を切断します。stdout はデフォルトでテキスト モードであるため、\n が \r\n になるなど、特定の ASCII 文字が Windows で別の文字に変換される場合があります。ヘッダーに必要以上のバイトが含まれてしまうため、Chrome 拡張機能は、何百万バイトものデータを送信していると判断し、混乱して接続を切断し、ヘッダー バイトの一部がメッセージに流れ込んで、 JSON パーサーが予期しない文字に遭遇する可能性があります。

stdout をバイナリ モードに設定してみてください。

_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 に答える