Msgrcv не получает сообщения, однако они были отправлены правильно - PullRequest
0 голосов
/ 20 декабря 2018

Я пишу базовую серверную программу, которая должна получать два типа сообщений от клиентов (первое сообщение относится к типу 1, а второе - к типу 2).Кажется, что он не видит сообщения от клиентов, которые были отправлены должным образом (msgsnd не возвращает -1).Я прочитал, что это может быть вызвано слишком большим сообщением, но мои сообщения имеют длину в несколько символов и мой буфер равен 100. Я не обнаружил никаких различий в создаваемых структурах, msgget также не возвращает никаких ошибок.Вот код программы сервера:

struct msgbuf
{
  long type;
  char text[100];
}m1;

int main()
{
  int id;
  if (id = msgget(1998,0666|IPC_EXCL)==-1) {
     printf("msgget error");
  }
  char first_msg[100][100];
  char second_msg[100][100];
  int counter = 0;
  while (counter < 100) {
     msgrcv(id,&m1,sizeof(m1.text),1,0);
     printf("%s",m1.text);
     strcpy(first_msg[counter], m1.text);
     msgrcv(id,&m1,sizeof(m1.text),2,0);
     printf("%s",m1.text);
     strcpy(second_msg[counter],m1.text);
     counter++;
  }
  return 0;
}

И код клиента:

struct msgbuf
{
   long type;
   char text[100];
};

int main()
{
   struct msgbuf m1,m2;
   int id;
   if ((id = msgget(1998,0666|IPC_EXCL)) == -1) {
     printf("error");
   }
   char first_msg[90];
   scanf("%s",&first_msg[0]);
   char second_msg[90];
   scanf("%s",&second_msg[0]);
   m1.type = 1;
   strcpy(m1.text,first_msg);
   if (msgsnd(id,&m1,sizeof(m1.text),0) == -1) {
     perror("msgsnd failed");
  }
  m2.type = 2;
  strcpy(m2.text,second_msg);
  if (msgsnd(id,&m2,sizeof(m2.text),0)==-1) {
    perror("msgsnd2 failed");
  }
  return 0;
}

1 Ответ

0 голосов
/ 20 декабря 2018

Это неприятная ошибка, вызванная проблемой приоритета оператора.

В клиенте вы правильно написали:

if ((id = msgget (1998,0666 | IPC_EXCL)) == -1) {

и парены гарантируют, что вы сначала назначите id, а затем сравните с -1.

Но на сервере у вас есть только:

, если(id = msgget (1998,0666 | IPC_EXCL) == - 1) {

К сожалению, на самом деле это читает if (id = (msgget(1998,0666|IPC_EXCL)==-1)), потому что сравнение имеет более высокий приоритет, чем назначение!

Исправлениетривиально: просто добавьте парены в server.c, как они есть в client.c

...