Я пишу расширение для Chrome, которое использует обмен сообщениями на собственном хосте. Цель состоит в том, чтобы Chrome открывал ссылки в браузере ОС по умолчанию при работе в режиме приложения. Chrome реализует обмен сообщениями с собственного хоста по каналам на стандартный ввод и вывод стандартного приложения. Это все хорошо, и у меня есть расширение, говорящее с нативным приложением. У меня проблема в том, что первые 4 байта данных содержат длину следующей строки, которая для моих целей всегда будет содержать нулевые символы. Пример strace показан ниже. Каков наилучший способ справиться с этим? Я хотел бы использовать что-то вроде cin или getline, которое остановит программу, пока ввод не будет получен, если это возможно.
Process 27964 attached
read(0, "~\0\0\0\"http://stackoverflow.com/qu"..., 4096) = 130
read(0,
Это текущий код C ++. Я пробовал варианты, используя cin.get и fgets, но они не ждут ввода, и Chrome убивает программу после того, как цикл запускается из-под контроля.
#include <string>
#include <iostream>
using namespace std;
int main(int argc, char* argv[]) {
for(;;) {
string message;
cin >> message;
if(!message.length()) break;
string cmd(string("xdg-open ") + message);
system(cmd.c_str());
}
return 0;
}
Насколько я понимаю Вот, длина должна быть в собственном байтовом порядке, поэтому тот же порядок байтов, который ваш компилятор использует для той же архитектуры ЦП:
каждое сообщение сериализуется с использованием JSON, кодировки UTF-8 и предшествует
с 32-битной длиной сообщения в собственном порядке байтов.
Это означает, что вы можете прочитать сначала длину:
uint32_t len;
while (cin.read(reinterpret_cast<char*>(&len), sizeof (len))) // process the messages
{
// you know the number of bytes in the message: just read them
string msg (len, ' '); // string filled with blanks
if (!cin.read(&msg[0], len) )
/* process unexpected error of missing bytes */;
else /* process the message normally */
}
Других решений пока нет …