Files
CS-LABS/kirill/lab_5/client.c
2025-12-11 08:12:48 +07:00

161 lines
4.9 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// mq_client.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <mqueue.h>
#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 <input_file> <output_file>\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;
}