4

Я использую chrome native messaging api для связи между моим chrome-расширением и native-windows-app, написанным на C++.соединение прерывается через некоторое время между native-app и chrome-extension

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

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

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

FYI: связь происходит через stdin и stdout между native-app и extension.

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

Вот код нативного приложения: windows-native-app-cpp

Вот код удлинительных: chrome-extension-js

Любой помощь будет оценена по достоинству!

спасибо.

EDIT: До сих пор я обнаружил, что существует проблема с определенной длиной данных, которую я отправляю.

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

ответ

4

Я получил это от группы с добавлением хрома, и он РАБОТАЕТ для меня.

Приклеивание точно такая же:

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

Смежные вопросы