MSGSND выдает "плохой адрес", в то время как использование идентичной MSGSND идентично в одной и той же программе.

Я работаю над важным проектом в университете, который связан с процессным взаимодействием с использованием механизма IPC (в приложении локального сервера-клиента).

И функция отправки сообщения не всегда работает.

Я попытался отправить сообщение с ТОЧНО такими же параметрами (только содержимое буфера отличается), и я получаю ошибку:

"Invalid Arguments". 

Было предложено создать новую очередь сообщений для этих сообщений (это было два типа (я имею в виду значение mtype) - хотя изменение на одно из ранее работавших ничего не изменило - сохранение значения mtype здесь не проблема).

Это я сделал, однако единственное, что сделал, это изменил ошибку на:

"Bad address".

В других частях программы (соединение клиента с сервером, отправка некоторых постоянных сообщений клиентам с сервера, отправка сообщения с некоторым запросом на сервер от любого клиента) сообщения работают отлично!

Подключение выглядит так:

Код сервера:

int komunikaty = msgget(777, IPC_CREAT | 0640);

int test = msgrcv(komunikaty, &wiad, sizeof(wiad) - sizeof(long), 1, 0);

if(test == -1){
    printf("\n problem: %s\n", strerror(errno));
}

wiad.mtype=2;

test = msgsnd(komunikaty, &wiad, sizeof(wiad) - sizeof(long), 0);

if(test == -1){
    printf("\n problem: %s\n", strerror(errno))
}

//sending message to other clients - clients are not supposed to start working before all are connected.

wiad.mtype = 10;
test=msgsnd(komunikaty, &wiad, sizeof(wiad)-sizeof(long), 0);

Код клиента:

int komunikaty = msgget(777, IPC_CREAT | 0640);

wiad.mtype = 1;

msgsnd(komunikaty, &wiad, sizeof(wiad) - sizeof(long), 0);

file = msgrcv(komunikaty, &wiad, sizeof(wiad) - sizeof(long), 2, 0);

msgrcv(komunikaty, &wiad, sizeof(wiad) - sizeof(long), 10, 0);

Все остальные используемые очереди инициализируются таким же образом (только первый параметр отличается), и все же такая попытка отправки сообщения:

int bitwa1 = msgget(771, IPC_CREAT | 0640);
//rest of the code
msgsnd(bitwa1, &wiad, sizeof(wiad) - sizeof(long), 0);

Не работает (я получаю "плохой адрес" errno). И когда я попытался прочитать состояние очереди с помощью параметра IPC_STAT в функции msgctl, он вернул -1, и я получил "неправильный адрес".

То же самое касается всех этих неудачных попыток отправки сообщения.

Я также пытался распечатать параметры до msgsnd - это хорошо (положительные числа, флаг равен 0).

Что может вызвать эту проблему?

0 ответов

Другие вопросы по тегам