Это мои клиентские и серверные коды для очереди сообщений. Предполагается, что требуемая функция довольно проста: клиент отправляет на сервер число, которое сервер получает, а затем отправляет обратно своего рода подтверждающее сообщение, например «end», которое также должно завершать работу клиента. Вот мой код для msgq_client. c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/shm.h>
#define PERMS 0644
struct my_msgbuf {
long mtype;
char mtext[200];
};
int main(void) {
struct my_msgbuf buf;
int msqid, len, retVal;
key_t key;
if ((key = ftok("msgq_buffer.txt", 'B')) == -1) {
perror("ftok");
exit(1);
}
printf("Key generated: %d\n", key);
if ((msqid = msgget(key, PERMS | IPC_CREAT)) == -1) {
perror("msgget");
exit(1);
}
printf("qid generated: %d\n", msqid);
printf("message queue: ready to send messages.\n");
// sending array size first
printf("Enter a number: ");
fgets(buf.mtext, sizeof(buf.mtext), stdin); buf.mtype = 0;
int n = atoi(buf.mtext);
printf("Sending size of array to roll server: %d\n", n);
retVal = msgsnd(msqid, &buf, 200, 0);
if (retVal == -1) {
perror("msgsnd for size");
}
printf("waiting for reply.....\n");
while (msgrcv(msqid, &buf, 3, 0, 0) == -1) {}
if (strncmp(buf.mtext, "end", 3) == 0) {
printf("message queue: done sending messages.\n");
if (msgctl(msqid, IPC_RMID, NULL) == -1) {
perror("msgctl for RMID");
}
}
return 0;
}
Вот мой код для
msgq_roll_server. c
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#include <unistd.h>
#include <sys/shm.h>
#define PERMS 0644
struct my_msgbuf {
long mtype;
char mtext[200];
};
int main(void) {
struct my_msgbuf buf;
int msqid;
int toend;
key_t key;
if ((key = ftok("msgq_buffer.txt", 'B')) == -1) {
perror("ftok");
exit(1);
}
printf("Key generated: %d\n", key);
if ((msqid = msgget(key, PERMS)) == -1) { /* connect to the queue */
perror("msgget");
exit(1);
}
printf("qid generated: %d\n", msqid);
printf("Roll message queue: ready to receive messages.\n");
if (msgrcv(msqid, &buf, 200, 0, 0) == -1) {
perror("msgrcv for size");
}
printf("received size of array: %d\n", atoi(buf.mtext));
strcpy(buf.mtext, "end");
if (msgsnd(msqid, (void *)&buf, strlen(buf.mtext), 0) == -1) {
perror("msgsnd for reply");
}
printf("message queue: done receiving messages.\n");
system("rm msgq.txt");
return 0;
}
А вот скриншот, когда я запускаю сервер и клиентские коды отдельно,
при проверке очередей сообщений перед запуском кода клиента:
при работе . / Msgq_client
при работе . / Msgq_roll_server
при проверке очередей сообщений после выполнения клиентского кода
Я не могу понять свой ошибка здесь в коде клиента. Я уже искал похожие проблемы в StackOverflow, и я прочитал справочные страницы для всех необходимых методов и видел примеры кодов использования. Я просто не могу найти неверный аргумент в вызове функции msgsnd в коде клиента.
Пожалуйста, помогите.