Завершение испытания C ⇐ Linux
-
Anonymous
Завершение испытания C
а. Создайте 2 файла, а именно server.c и client.c.
При первом запуске server.c пользователю будет предложено ввести количество
обслуживаемых клиентов ( диапазон от 1 до 5).
При первом запуске client.c он предлагает пользователю ввести имя пользователя.
Это имя пользователя затем отправляется на сервер для проверки. существует ли он уже
или нет. Если он уже существует, он запросит еще один запрос
вводить имя пользователя, пока оно не будет получено сервером.
b. Когда все клиенты, необходимые серверу, будут собраны, каждому
клиенту будет предложено ввести необходимую
службу, а именно: имя контейнера, используемый образ, команду запуска контейнера,
и объем. Порядок, в котором клиенты отправляют запросы на обслуживание на сервер, определяется временем их регистрации. Пример: если первым регистрируется имя пользователя
ragnar, а затем имя пользователя полотенце, то сначала ragnar
отправит запрос, затем полотенце и так далее.
c. После того, как все запросы на обслуживание от клиента собраны,
сервер объединяет их в файл компоновки Docker. Затем запустите
файл компоновки Docker, созданный ранее
d. До тех пор, пока не будет завершена
предыдущая компоновка докера, client.c запросит у пользователя еще один запрос. Указанная подсказка соответствует пункту (b). Если каждый клиент делает
то же самое в пункте (b), то сервер сгенерирует новый файл docker
compose. Затем запущенный ранее контейнер будет
уничтожен, а затем заменен последней службой,
запрошенной ранее у клиента.
Итак, я написал код до b. но я думаю, что не закончил a, потому что мой серверный файл не проверяет уже существующее имя. а для b возникла ошибка: после того, как я закончил заполнение первой клиентской службы, второй клиент не выводит запрос на службу, а только имя пользователя. и в подсказке сервера формат вывода все еще неверен. наконец, что касается b и c, я тоже до сих пор не работаю, так что кто-нибудь может мне помочь, пожалуйста. Я так ценю ваши ответы.
SERVER.C
#include
#include
#include
#include
#include
#include
#include
#define MAX_CLIENTS 5
#define MAX_REQUEST_LEN 256
// Struktur pesan untuk komunikasi dengan clients
struct message {
long mtype;
char mtext[MAX_REQUEST_LEN];
};
// Struktur untuk menyimpan informasi layanan dari setiap client
struct service_request {
char username[MAX_REQUEST_LEN];
char container_name[MAX_REQUEST_LEN];
char image_used[MAX_REQUEST_LEN];
char start_command[MAX_REQUEST_LEN];
char volume[MAX_REQUEST_LEN];
};
// Fungsi untuk mengirim pesan ke client
void send_message(int msqid, struct message *msg) {
if (msgsnd(msqid, msg, MAX_REQUEST_LEN, 0) == -1) {
perror("msgsnd");
exit(1);
}
}
// Fungsi untuk menerima pesan dari client
void receive_message(int msqid, struct message *msg) {
if (msgrcv(msqid, msg, MAX_REQUEST_LEN, 1, 0) == -1) {
perror("msgrcv");
exit(1);
}
}
// Fungsi untuk set status server
void set_server_status(int status) {
FILE *fp = fopen("server_status.txt", "w");
if (fp == NULL) {
perror("Failed to open server status file");
exit(1);
}
fprintf(fp, "%d", status);
fclose(fp);
}
// Fungsi untuk mendapatkan status server
int get_server_status() {
FILE *fp = fopen("server_status.txt", "r");
if (fp == NULL) {
perror("Failed to open server status file");
exit(1);
}
int status;
fscanf(fp, "%d", &status);
fclose(fp);
return status;
}
int main() {
key_t key;
int msqid;
struct message msg;
struct service_request requests[MAX_CLIENTS]; // Array untuk menyimpan informasi permintaan layanan dari setiap client
int num_clients = 0;
// Set status server menjadi berjalan
set_server_status(1);
// Buat key untuk message queue
if ((key = ftok("server.c", 'B')) == -1) {
perror("ftok");
exit(1);
}
// Buat message queue
if ((msqid = msgget(key, 0644 | IPC_CREAT)) == -1) {
perror("msgget");
exit(1);
}
printf("Server is running...\n");
// Menerima jumlah klien yang akan dilayani
printf("Enter the number of clients to serve (1-5): ");
scanf("%d", &num_clients);
// Batasi jumlah klien
if (num_clients < 1 || num_clients > MAX_CLIENTS) {
printf("Invalid number of clients. Exiting...\n");
exit(1);
}
// Menerima nama pengguna dari setiap klien
int client_count = 0;
while (client_count < num_clients) {
receive_message(msqid, &msg);
int i;
for (i = 0; i < client_count; i++) {
if (strcmp(requests.username, msg.mtext) == 0) {
strcpy(msg.mtext, "exists");
send_message(msqid, &msg);
break;
}
}
if (i == client_count) {
strcpy(requests[client_count].username, msg.mtext);
client_count++;
strcpy(msg.mtext, "accepted");
send_message(msqid, &msg);
}
}
printf("All client usernames accepted.\n");
// Menerima permintaan layanan dari klien yang telah mendaftar
for (int i = 0; i < num_clients; i++) {
receive_message(msqid, &msg);
printf("Received service request from client %s:\n", requests.username);
printf("Container Name: %s\n", msg.mtext);
strcpy(requests.container_name, msg.mtext);
receive_message(msqid, &msg);
printf("Image Used: %s\n", msg.mtext);
strcpy(requests.image_used, msg.mtext);
receive_message(msqid, &msg);
printf("Start Command: %s\n", msg.mtext);
strcpy(requests.start_command, msg.mtext);
receive_message(msqid, &msg);
printf("Volume: %s\n", msg.mtext);
strcpy(requests.volume, msg.mtext);
}
// Set status server menjadi tidak berjalan
set_server_status(0);
// Tampilkan layanan yang diminta berdasarkan username
printf("Service requests:\n");
for (int i = 0; i < num_clients; i++) {
printf("Username: %s\n", requests.username);
printf("Container Name: %s\n", requests.container_name);
printf("Image Used: %s\n", requests.image_used);
printf("Start Command: %s\n", requests.start_command);
printf("Volume: %s\n", requests[i].volume);
printf("----------------------------------------\n");
}
return 0;
}
КЛИЕНТ.C
#include
#include
#include
#include
#include
#include
#include
#define MAX_REQUEST_LEN 256
// Struktur pesan untuk komunikasi dengan server
struct message {
long mtype;
char mtext[MAX_REQUEST_LEN];
};
// Struktur untuk menyimpan informasi permintaan layanan
struct service_request {
char container_name[MAX_REQUEST_LEN];
char image_used[MAX_REQUEST_LEN];
char start_command[MAX_REQUEST_LEN];
char volume[MAX_REQUEST_LEN];
};
// Fungsi untuk mengirim pesan ke server
void send_message(int msqid, char *message) {
struct message msg;
msg.mtype = 1;
strcpy(msg.mtext, message);
if (msgsnd(msqid, &msg, MAX_REQUEST_LEN, 0) == -1) {
perror("msgsnd");
exit(1);
}
}
// Fungsi untuk menerima pesan dari server
void receive_message(int msqid, struct message *msg) {
if (msgrcv(msqid, msg, MAX_REQUEST_LEN, 1, 0) == -1) {
perror("msgrcv");
exit(1);
}
}
// Fungsi untuk mencetak pesan koneksi terputus
void print_disconnected() {
printf("Connection terminated.\n");
}
// Fungsi untuk memeriksa apakah server berjalan
int is_server_running() {
key_t key;
int msqid;
if ((key = ftok("server.c", 'B')) == -1) {
return 0; // Gagal mendapatkan key, server mungkin tidak berjalan
}
// Coba mengakses message queue
if ((msqid = msgget(key, 0644)) == -1) {
return 0; // Gagal mengakses message queue, server mungkin tidak berjalan
}
return 1; // Server berjalan
}
int main() {
key_t key;
int msqid;
struct message msg;
struct service_request request; // Deklarasi struct service_request
// Buat key untuk message queue
if ((key = ftok("server.c", 'B')) == -1) {
perror("ftok");
exit(1);
}
// Dapatkan message queue ID
if ((msqid = msgget(key, 0644 | IPC_NOWAIT)) == -1) {
// Jika tidak dapat terhubung ke server
print_disconnected();
exit(1);
}
// Dapatkan status server
int server_running = is_server_running();
// Jika server tidak berjalan, keluarkan pesan dan hentikan program
if (!server_running) {
print_disconnected();
exit(1);
}
// Input dan kirim username ke server
do {
printf("Enter your username: ");
scanf("%s", msg.mtext);
send_message(msqid, msg.mtext);
receive_message(msqid, &msg);
if (strcmp(msg.mtext, "exists") == 0) {
printf("Username already exists. Please enter a different username.\n");
}
} while (strcmp(msg.mtext, "exists") == 0);
printf("Username accepted.\n");
// Meminta input permintaan layanan
printf("Enter container name: ");
scanf("%s", request.container_name);
printf("Enter image used: ");
scanf("%s", request.image_used);
printf("Enter start command: ");
scanf("%s", request.start_command);
printf("Enter volume: ");
scanf("%s", request.volume);
// Kirim permintaan layanan ke server
send_message(msqid, request.container_name);
send_message(msqid, request.image_used);
send_message(msqid, request.start_command);
send_message(msqid, request.volume);
printf("Service request sent.\n");
return 0;
}
Подробнее здесь: https://stackoverflow.com/questions/784 ... -challange
а. Создайте 2 файла, а именно server.c и client.c.
При первом запуске server.c пользователю будет предложено ввести количество
обслуживаемых клиентов ( диапазон от 1 до 5).
При первом запуске client.c он предлагает пользователю ввести имя пользователя.
Это имя пользователя затем отправляется на сервер для проверки. существует ли он уже
или нет. Если он уже существует, он запросит еще один запрос
вводить имя пользователя, пока оно не будет получено сервером.
b. Когда все клиенты, необходимые серверу, будут собраны, каждому
клиенту будет предложено ввести необходимую
службу, а именно: имя контейнера, используемый образ, команду запуска контейнера,
и объем. Порядок, в котором клиенты отправляют запросы на обслуживание на сервер, определяется временем их регистрации. Пример: если первым регистрируется имя пользователя
ragnar, а затем имя пользователя полотенце, то сначала ragnar
отправит запрос, затем полотенце и так далее.
c. После того, как все запросы на обслуживание от клиента собраны,
сервер объединяет их в файл компоновки Docker. Затем запустите
файл компоновки Docker, созданный ранее
d. До тех пор, пока не будет завершена
предыдущая компоновка докера, client.c запросит у пользователя еще один запрос. Указанная подсказка соответствует пункту (b). Если каждый клиент делает
то же самое в пункте (b), то сервер сгенерирует новый файл docker
compose. Затем запущенный ранее контейнер будет
уничтожен, а затем заменен последней службой,
запрошенной ранее у клиента.
Итак, я написал код до b. но я думаю, что не закончил a, потому что мой серверный файл не проверяет уже существующее имя. а для b возникла ошибка: после того, как я закончил заполнение первой клиентской службы, второй клиент не выводит запрос на службу, а только имя пользователя. и в подсказке сервера формат вывода все еще неверен. наконец, что касается b и c, я тоже до сих пор не работаю, так что кто-нибудь может мне помочь, пожалуйста. Я так ценю ваши ответы.
SERVER.C
#include
#include
#include
#include
#include
#include
#include
#define MAX_CLIENTS 5
#define MAX_REQUEST_LEN 256
// Struktur pesan untuk komunikasi dengan clients
struct message {
long mtype;
char mtext[MAX_REQUEST_LEN];
};
// Struktur untuk menyimpan informasi layanan dari setiap client
struct service_request {
char username[MAX_REQUEST_LEN];
char container_name[MAX_REQUEST_LEN];
char image_used[MAX_REQUEST_LEN];
char start_command[MAX_REQUEST_LEN];
char volume[MAX_REQUEST_LEN];
};
// Fungsi untuk mengirim pesan ke client
void send_message(int msqid, struct message *msg) {
if (msgsnd(msqid, msg, MAX_REQUEST_LEN, 0) == -1) {
perror("msgsnd");
exit(1);
}
}
// Fungsi untuk menerima pesan dari client
void receive_message(int msqid, struct message *msg) {
if (msgrcv(msqid, msg, MAX_REQUEST_LEN, 1, 0) == -1) {
perror("msgrcv");
exit(1);
}
}
// Fungsi untuk set status server
void set_server_status(int status) {
FILE *fp = fopen("server_status.txt", "w");
if (fp == NULL) {
perror("Failed to open server status file");
exit(1);
}
fprintf(fp, "%d", status);
fclose(fp);
}
// Fungsi untuk mendapatkan status server
int get_server_status() {
FILE *fp = fopen("server_status.txt", "r");
if (fp == NULL) {
perror("Failed to open server status file");
exit(1);
}
int status;
fscanf(fp, "%d", &status);
fclose(fp);
return status;
}
int main() {
key_t key;
int msqid;
struct message msg;
struct service_request requests[MAX_CLIENTS]; // Array untuk menyimpan informasi permintaan layanan dari setiap client
int num_clients = 0;
// Set status server menjadi berjalan
set_server_status(1);
// Buat key untuk message queue
if ((key = ftok("server.c", 'B')) == -1) {
perror("ftok");
exit(1);
}
// Buat message queue
if ((msqid = msgget(key, 0644 | IPC_CREAT)) == -1) {
perror("msgget");
exit(1);
}
printf("Server is running...\n");
// Menerima jumlah klien yang akan dilayani
printf("Enter the number of clients to serve (1-5): ");
scanf("%d", &num_clients);
// Batasi jumlah klien
if (num_clients < 1 || num_clients > MAX_CLIENTS) {
printf("Invalid number of clients. Exiting...\n");
exit(1);
}
// Menerima nama pengguna dari setiap klien
int client_count = 0;
while (client_count < num_clients) {
receive_message(msqid, &msg);
int i;
for (i = 0; i < client_count; i++) {
if (strcmp(requests.username, msg.mtext) == 0) {
strcpy(msg.mtext, "exists");
send_message(msqid, &msg);
break;
}
}
if (i == client_count) {
strcpy(requests[client_count].username, msg.mtext);
client_count++;
strcpy(msg.mtext, "accepted");
send_message(msqid, &msg);
}
}
printf("All client usernames accepted.\n");
// Menerima permintaan layanan dari klien yang telah mendaftar
for (int i = 0; i < num_clients; i++) {
receive_message(msqid, &msg);
printf("Received service request from client %s:\n", requests.username);
printf("Container Name: %s\n", msg.mtext);
strcpy(requests.container_name, msg.mtext);
receive_message(msqid, &msg);
printf("Image Used: %s\n", msg.mtext);
strcpy(requests.image_used, msg.mtext);
receive_message(msqid, &msg);
printf("Start Command: %s\n", msg.mtext);
strcpy(requests.start_command, msg.mtext);
receive_message(msqid, &msg);
printf("Volume: %s\n", msg.mtext);
strcpy(requests.volume, msg.mtext);
}
// Set status server menjadi tidak berjalan
set_server_status(0);
// Tampilkan layanan yang diminta berdasarkan username
printf("Service requests:\n");
for (int i = 0; i < num_clients; i++) {
printf("Username: %s\n", requests.username);
printf("Container Name: %s\n", requests.container_name);
printf("Image Used: %s\n", requests.image_used);
printf("Start Command: %s\n", requests.start_command);
printf("Volume: %s\n", requests[i].volume);
printf("----------------------------------------\n");
}
return 0;
}
КЛИЕНТ.C
#include
#include
#include
#include
#include
#include
#include
#define MAX_REQUEST_LEN 256
// Struktur pesan untuk komunikasi dengan server
struct message {
long mtype;
char mtext[MAX_REQUEST_LEN];
};
// Struktur untuk menyimpan informasi permintaan layanan
struct service_request {
char container_name[MAX_REQUEST_LEN];
char image_used[MAX_REQUEST_LEN];
char start_command[MAX_REQUEST_LEN];
char volume[MAX_REQUEST_LEN];
};
// Fungsi untuk mengirim pesan ke server
void send_message(int msqid, char *message) {
struct message msg;
msg.mtype = 1;
strcpy(msg.mtext, message);
if (msgsnd(msqid, &msg, MAX_REQUEST_LEN, 0) == -1) {
perror("msgsnd");
exit(1);
}
}
// Fungsi untuk menerima pesan dari server
void receive_message(int msqid, struct message *msg) {
if (msgrcv(msqid, msg, MAX_REQUEST_LEN, 1, 0) == -1) {
perror("msgrcv");
exit(1);
}
}
// Fungsi untuk mencetak pesan koneksi terputus
void print_disconnected() {
printf("Connection terminated.\n");
}
// Fungsi untuk memeriksa apakah server berjalan
int is_server_running() {
key_t key;
int msqid;
if ((key = ftok("server.c", 'B')) == -1) {
return 0; // Gagal mendapatkan key, server mungkin tidak berjalan
}
// Coba mengakses message queue
if ((msqid = msgget(key, 0644)) == -1) {
return 0; // Gagal mengakses message queue, server mungkin tidak berjalan
}
return 1; // Server berjalan
}
int main() {
key_t key;
int msqid;
struct message msg;
struct service_request request; // Deklarasi struct service_request
// Buat key untuk message queue
if ((key = ftok("server.c", 'B')) == -1) {
perror("ftok");
exit(1);
}
// Dapatkan message queue ID
if ((msqid = msgget(key, 0644 | IPC_NOWAIT)) == -1) {
// Jika tidak dapat terhubung ke server
print_disconnected();
exit(1);
}
// Dapatkan status server
int server_running = is_server_running();
// Jika server tidak berjalan, keluarkan pesan dan hentikan program
if (!server_running) {
print_disconnected();
exit(1);
}
// Input dan kirim username ke server
do {
printf("Enter your username: ");
scanf("%s", msg.mtext);
send_message(msqid, msg.mtext);
receive_message(msqid, &msg);
if (strcmp(msg.mtext, "exists") == 0) {
printf("Username already exists. Please enter a different username.\n");
}
} while (strcmp(msg.mtext, "exists") == 0);
printf("Username accepted.\n");
// Meminta input permintaan layanan
printf("Enter container name: ");
scanf("%s", request.container_name);
printf("Enter image used: ");
scanf("%s", request.image_used);
printf("Enter start command: ");
scanf("%s", request.start_command);
printf("Enter volume: ");
scanf("%s", request.volume);
// Kirim permintaan layanan ke server
send_message(msqid, request.container_name);
send_message(msqid, request.image_used);
send_message(msqid, request.start_command);
send_message(msqid, request.volume);
printf("Service request sent.\n");
return 0;
}
Подробнее здесь: https://stackoverflow.com/questions/784 ... -challange
Мобильная версия