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).
Что может вызвать эту проблему?