javascript — через некоторое время разрывается соединение между native-app и chrome-extension

Я использую API Chrome для обмена сообщениями между моим Chrome-расширением и собственным Windows-приложением, написанным на C ++.

Соединение устанавливается отлично, и данные также обмениваются. Но соединение разрывается после случайного количества звонков с расширения на native-приложение.

Я попытался запустить native-app независимо, и он работает нормально при бесконечном цикле (исключений не возникает).

Мое нативное приложение генерирует почти 300 КБ данных при первом вызове (encode_frame ()) и затем выполняются последовательные вызовы (за 300 мс), которые генерируют данные от 0 до 300 КБ (encode_frame_difference ()). Данные в кодировке base64.

К вашему сведению: связь происходит через стандартный ввод и стандартный вывод между native-приложением и расширением.

Проблема в том, что я не могу понять, почему через некоторое время разрывается соединение.

Здесь код нативного приложения:
окна-нативное приложение-каст

Здесь код расширения:
хром-расширение-JS

Любая помощь будет оценена!

Спасибо.

РЕДАКТИРОВАТЬ:
До сих пор я обнаружил, что есть проблема с определенной длиной данных, которые я отправляю.

например. Если длина JSON находится между 2560 и 2815, он перестает работать. в то время как для длин JSON, таких как 2816 или 6656, это работает.

4

Решение

Я получил это от группы расширения хрома, и это работает для меня.

Вставляем точно так же:

Проблема, вероятно, в заголовке, который содержит четырехбайтовую длину сообщения. Если это странно, Chrome разорвет соединение. Так как стандартный вывод по умолчанию находится в текстовом режиме, некоторые символы 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

4

Другие решения

Других решений пока нет …