msgsnd erro: неверный аргумент для программы IP C - PullRequest
0 голосов
/ 21 марта 2020

Это мои клиентские и серверные коды для очереди сообщений. Предполагается, что требуемая функция довольно проста: клиент отправляет на сервер число, которое сервер получает, а затем отправляет обратно своего рода подтверждающее сообщение, например «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;
}

А вот скриншот, когда я запускаю сервер и клиентские коды отдельно,

при проверке очередей сообщений перед запуском кода клиента: message queues present before

при работе . / Msgq_client

message queue client invalid argument

при работе . / Msgq_roll_server

message queue server waits for input

при проверке очередей сообщений после выполнения клиентского кода

message queue created successfully

Я не могу понять свой ошибка здесь в коде клиента. Я уже искал похожие проблемы в StackOverflow, и я прочитал справочные страницы для всех необходимых методов и видел примеры кодов использования. Я просто не могу найти неверный аргумент в вызове функции msgsnd в коде клиента.

Пожалуйста, помогите.

...