Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > msgsnd Invalid argument


Автор: Anark1 17.12.2009, 14:06
Здравствуйте, 
имеется две программы - клиент и сервер, подзадача - отправка клиентом сообщений серверу, при попытке отправки получаю ошибку 22 Invalid argument
код клиента ниже, соединение с очередью корректно.
Также стоит заметить что пишу под XP с Cygwin. 

Код

typedef struct msg_first_buf
{
        long type;
        int params[3];
} msg_first_buf;
...
msg_first_buf msg_first;
...
key = ftok("server.c",'y');
msid = msgget(key, 0666);
...
scanf("%d %d %d",&(msg_first.params[0]),&(msg_first.params[1]),&(msg_first.params[2]));
msg_first.type = MSG_FIRST;
if (msgsnd(msid,(msg_first_buf*)(&msg_first),sizeof(int)*3,IPC_NOWAIT)==-1)
        printf("errno %d\n",errno);
perror(0);


Вообще в man'e написана другая структура, но я так понимаю главное - наличие типа long в начале структуры. 
Константа MSG_FIRST описана в заголовке. Как только не менял структуру сообщения - никак. Подскажите что делаю не так.

Автор: bsa 17.12.2009, 17:23
Я не знаю, что за MSG_FIRST ты используешь (у меня ни в одном стандартном хидере такого нет), может он отрицательный? Попробуй вместо него использовать что-то заведомо положительное.

Автор: GrayCardinal 17.12.2009, 19:15
Цитата

Вообще в man'e написана другая структура, но я так понимаю главное - наличие типа long в начале структуры.

Вы тут явно не правы  smile 

Автор: svlary 18.12.2009, 06:48
Цитата(GrayCardinal @  17.12.2009,  19:15 Найти цитируемый пост)
Вы тут явно не правы

   В данном случае НЕ правы все-таки Вы. И ф-ция msgsnd и функция msgrcv вторым параметром (буфер сообщения) имеют void *msgbuf. Единственное, что требуют соглашения System V  - что бы в начале этого буфера было место под long mtype.
Цитата
получаю ошибку 22 Invalid argument

  Глядя на Ваш исходный код, могу предположить, что единственный аргумент, который может быть НЕправильным (т.е. может иметь НЕправильное значение!) - это msid вот тут :
Код

msgsnd(msid,...):

  И сразу вопрос - а Вы проверяете его значение ? В смысле, после вызова  
Код

msid = msgget(key, 0666);

Анализируете результат ? Здесь Вы не пытаетесь создать очередь. Значит - она уже должна существовать.
А что говорит команда "ipcs -q" ?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)