Msgrcv не получает сообщения, однако они были отправлены правильно
Я пишу основную серверную программу, которая должна получать два типа сообщений от клиентов (первое сообщение относится к типу 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 ответ
Это неприятная ошибка, вызванная проблемой приоритета операторов.
В клиенте вы правильно написали:
if ((id = msgget (1998,0666 | IPC_EXCL)) == -1) {
и параны гарантируют, что вы сначала назначаете id
а затем сравнить с -1.
Но на сервере у вас есть только:
if (id = msgget (1998,0666 | IPC_EXCL) == - 1) {
К сожалению, это на самом деле читает if (id = (msgget(1998,0666|IPC_EXCL)==-1))
потому что сравнение имеет более высокий приоритет, чем назначение!
Исправление тривиально: просто добавьте парены в server.c, как они есть в client.c