связь между native-app и chrome-extension

У меня есть нативное приложение, написанное на c ++ и расширение Chrome.

Я общаюсь между ними, используя «Chrome native Messaging».

Код родного приложения:

int main(int argc, char* argv[]) {
unsigned int a, c, i, t=0;
std::string inp;  do {
inp="";
t=0;
// Sum the first 4 chars from stdin (the length of the message passed).
for (i = 0; i <= 3; i++) {
t += getchar();
}

// Loop getchar to pull in the message until we reach the total
//  length provided.
for (i=0; i < t; i++) {
c = getchar();
inp += c;
}

// Collect the length of the message
unsigned int len = inp.length();
//// We need to send the 4 btyes of length information
std::cout << char(((len>>0) & 0xFF))
<< char(((len>>8) & 0xFF))
<< char(((len>>16) & 0xFF))
<< char(((len>>24) & 0xFF));
//// Now we can output our message
std::cout << inp <<std::endl;
flushall();
}while(cnt < 2 );
return 0;  }

Здесь я читаю сообщение, отправленное расширением chrome на стандартный ввод. и отправив то же сообщение обратно, написав его на стандартный вывод.

Расширение использует PostMessage ()

Это работает … НО ..

Когда я помещаю свою программу в непрерывный цикл while, поток выполняется только один раз!

то есть port.postMessage ({‘text’: ‘hello_1’}) возвращается, как и ожидалось, но если я это сделаю

port.postMessage ({‘text’: ‘hello_2’}) он не возвращается обратно.

Я не могу понять, в чем проблема. Требуется ли многопоточность?

Пожалуйста помоги!

Спасибо!

5

Решение

Ответ Марка содержит некоторые ошибки (унаследованные от вопроса) и не будет работать для сообщений с длинами, которые не помещаются в один байт.

Протокол Chrome для связи с нативными приложениями:

  • запросы к нативному приложению принимаются через стандартный ввод
  • ответы на Chrome отправляются через стандартный вывод
  • Chrome плохо работает со стилем Windows \ r \ n, поэтому избегайте этого в сообщениях и установите режим stdin в двоичный режим (чтобы вы могли правильно прочитать запрос len, и \ n не «превращается» в \ r \ n):

    _setmode(_fileno(stdin),_O_BINARY);
    

Сообщения запроса и ответа представляют собой JSON с 4-байтовым заголовком (uint32), содержащим длину сообщения:
[длина 4-байтового заголовка] [сообщение]

Чтение заголовка запроса:

uint32_t reqLen = 0;
cin.read(reinterpret_cast<char*>(&reqLen) ,4);

Написание заголовка ответа:

cout.write(reinterpret_cast<char*>(&responseLen),4);
10

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

Это работает для меня:

 int main(int argc, char* argv[])
{

std::cout.setf( std::ios_base::unitbuf ); //instead of "<< eof" and "flushall"unsigned int a, c, i, t=0;
std::string inp;

do {

inp="";
t=0;
// Sum the first 4 chars from stdin (the length of the message passed).
for (i = 0; i <= 3; i++) {
t += getchar();
}

// Loop getchar to pull in the message until we reach the total
//  length provided.
for (i=0; i < t; i++) {
c = getchar();
inp += c;
}

//Collect the length of the message
unsigned int len = inp.length();
//// We need to send the 4 btyes of length information
std::cout << char(((len>>0) & 0xFF))
<< char(((len>>8) & 0xFF))
<< char(((len>>16) & 0xFF))
<< char(((len>>24) & 0xFF));
//// Now we can output our message
std::cout << inp;
}

2

Алгоритм декодирования длины строки неверен. Это исправление:

for (i = 0; i <= 3; i++) {
c = getchar();
l |= (c << 8*i);
}
0