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.
}
}