C/C++ сервер, общение через stdin/stdout с клиентами (блокировка на stdin до тех пор, пока не будет прочитано несколько байтов)

Это вопрос о межпроцессном взаимодействии через stdin/stdout.

Проблема в том, что у меня есть библиотека COM, которую я не смог использовать с любым мостом Java-COM (одна конкретная функция всегда вызывает дамп ядра). Но я смог использовать его из программы на C++.

Поэтому я решил создать серверную программу-обертку на C++ для этих вызовов и общаться с ней через Java через stdin/stdout, но здесь я столкнулся с проблемой. Я решил использовать protobufs для передачи сообщений, основная проблема - чтение ввода на стороне C++. Мне нужен метод, который будет блокировать, пока в stdin не будет записано определенное количество байтов для его чтения.

Идея заключалась в том, чтобы использовать protobufs от Google и настроить связь следующим образом:

  • Программа на C запускает бесконечный цикл, блокируя вход STDIN, ожидая ввода 4 байтов, что будет длиной входящего сообщения.
  • Затем блокируется, чтобы получить сообщение целиком (число необработанных байтов известно)
  • Разобрать сообщение с помощью protobuf
  • Работай
  • Записать вывод в stdout (вероятно, таким же образом, добавляя сообщение с количеством входящих байтов)
  • Java Clinet читает это, используя DataStream или что-то в этом роде, а также расшифровывает, используя protobufs.

Настроить эту двустороннюю связь оказалось гораздо сложнее, чем я мог бы подумать, из-за недостатка знаний о программировании на C++ и Windows (я скомпилировал это с помощью MSVS2013 Community, и существует так много специфичных для Windows marcos/typedefs из всего этого кода COM).

Есть ли какая-нибудь сторонняя библиотека, которая может сделать создание такого простого сервера, ну, на самом деле, простым?

PS: может быть C, может быть C++, мне просто нужно, чтобы он работал на Windows.

1 ответ

Относительно простой цикл обработки сообщений может выглядеть следующим образом. Однако вы должны действительно проверить возвращаемое значение обоих чтений и обработать ошибки там.

void read_and_process_message(void) {
  while(true) {
    long nMessageBytes;
    read(stdin, &nMessageBytes, sizeof(long));
    //Convert from network byte-order to local byte order
    nMessageBytes = ntohl(nMessageBytes);
    char * buffer = malloc(nMessageBytes);
    read(stdin, buffer, nMessageBytes);
    // Do something with your buffer and write to stdout.
  }
}
Другие вопросы по тегам