// mq_client.c #include #include #include #include #include #include #include #include #include #define MQ_REQUEST "/mq_request" #define MQ_RESPONSE "/mq_response" #define MQ_MAXMSG 10 #define BUFFER_SIZE 4096 void print_usage(const char *progname) { fprintf(stderr, "Usage: %s \n", progname); fprintf(stderr, "Example: %s input.txt output.txt\n", progname); } int main(int argc, char *argv[]) { if (argc != 3) { fprintf(stderr, "ERROR: Неверное количество аргументов\n"); print_usage(argv[0]); return 1; } const char *input_file = argv[1]; const char *output_file = argv[2]; printf("=== MQ Client ===\n"); printf("Input file : %s\n", input_file); printf("Output file: %s\n", output_file); int in_fd = open(input_file, O_RDONLY); if (in_fd < 0) { fprintf(stderr, "ERROR: Не удалось открыть входной файл %s: %s\n", input_file, strerror(errno)); return 1; } char *buffer = malloc(BUFFER_SIZE); if (!buffer) { fprintf(stderr, "ERROR: Не удалось выделить память\n"); close(in_fd); return 1; } ssize_t bytes_read = read(in_fd, buffer, BUFFER_SIZE - 1); close(in_fd); if (bytes_read < 0) { fprintf(stderr, "ERROR: Не удалось прочитать файл: %s\n", strerror(errno)); free(buffer); return 1; } buffer[bytes_read] = '\0'; printf("Прочитано байт из файла: %zd\n", bytes_read); struct mq_attr attr; memset(&attr, 0, sizeof(attr)); attr.mq_flags = 0; attr.mq_maxmsg = MQ_MAXMSG; attr.mq_msgsize = BUFFER_SIZE; attr.mq_curmsgs = 0; mqd_t mq_req = mq_open(MQ_REQUEST, O_WRONLY); if (mq_req == (mqd_t) -1) { fprintf(stderr, "ERROR: Не удалось открыть очередь запросов %s: %s\n", MQ_REQUEST, strerror(errno)); fprintf(stderr, "Убедитесь, что сервер запущен!\n"); free(buffer); return 1; } mqd_t mq_resp = mq_open(MQ_RESPONSE, O_RDONLY); if (mq_resp == (mqd_t) -1) { fprintf(stderr, "ERROR: Не удалось открыть очередь ответов %s: %s\n", MQ_RESPONSE, strerror(errno)); mq_close(mq_req); free(buffer); return 1; } if (mq_send(mq_req, buffer, (size_t) bytes_read, 0) == -1) { fprintf(stderr, "ERROR: mq_send failed: %s\n", strerror(errno)); mq_close(mq_req); mq_close(mq_resp); free(buffer); return 1; } printf("Отправлено байт: %zd\n", bytes_read); // размер буфера >= mq_msgsize ssize_t resp_bytes = mq_receive(mq_resp, buffer, BUFFER_SIZE, NULL); if (resp_bytes < 0) { fprintf(stderr, "ERROR: mq_receive failed: %s\n", strerror(errno)); mq_close(mq_req); mq_close(mq_resp); free(buffer); return 1; } if (resp_bytes >= BUFFER_SIZE) resp_bytes = BUFFER_SIZE - 1; buffer[resp_bytes] = '\0'; printf("Получено байт от сервера: %zd\n", resp_bytes); char *repl_info = strstr(buffer, "\nREPLACEMENTS:"); long long replacements = 0; if (repl_info) { sscanf(repl_info, "\nREPLACEMENTS:%lld", &replacements); *repl_info = '\0'; resp_bytes = repl_info - buffer; } else { fprintf(stderr, "WARNING: Не найдена служебная строка REPLACEMENTS, " "запишем весь ответ как есть\n"); } int out_fd = open(output_file, O_CREAT | O_WRONLY | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); if (out_fd < 0) { fprintf(stderr, "ERROR: Не удалось открыть выходной файл %s: %s\n", output_file, strerror(errno)); mq_close(mq_req); mq_close(mq_resp); free(buffer); return 1; } ssize_t written = write(out_fd, buffer, resp_bytes); close(out_fd); if (written != resp_bytes) { fprintf(stderr, "ERROR: Ошибка записи в выходной файл\n"); mq_close(mq_req); mq_close(mq_resp); free(buffer); return 1; } printf("Записано байт в выходной файл: %zd\n", written); printf("Количество выполненных замен: %lld\n", replacements); printf("\nОбработка завершена успешно!\n"); mq_close(mq_req); mq_close(mq_resp); free(buffer); return 0; }