MSGSND выдает «плохой адрес», в то время как использование идентичной MSGSND идентично в одной и той же программе. - PullRequest
0 голосов
/ 13 марта 2019

Я работаю над важным проектом в университете, который касается процесса взаимодействия с использованием механизма 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);

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

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

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

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

...