2013-05-14 3 views
0
for (;;) 
{ 
    if (msgrcv(msqid, &flag, sizeof(struct flags) - sizeof(long), 1, IPC_NOWAIT)>0) 
      break; 
} 
    msgsnd(msqid, &message , sizeof(struct messages) - sizeof(long), 0); 

Есть ли accept() функция, как и в sockets IPC, но message queues IPC? Мой сервер должен ждать подключения к клиенту и только тогда, когда клиент подключен к отправке данных обратно. Специальная отправка от клиента некоторых бесполезных данных и проверка данных в бесконечном цикле (это означает, что клиент подключен, я знаю, что это очень глупый алгоритм).принимать() в сообщении очереди IPC UNIX

+0

http://beej.us/guide/bgnet/output/html/multipage/index.html - Прочтите этот сетевой учебник, чтобы понять основы сетевого взаимодействия. – VoidPointer

ответ

0

Нет, нет ничего аналогичного. Очереди сообщений больше похожи на сокеты для датаграмм без установления соединения, чем они похожи на потоки сокетов, ориентированные на соединение (которые поддерживают accept() и т. Д.).

Некоторые реализации (z/OS?) Отображают количество процессов, заблокированных на msgrcv, что похоже на то, что вы ищете, но это не переносимо.

Как я вижу, у вас есть два простых варианта.

Сначала сделайте то, что вы делаете, но не IPC_NOWAIT на сервере msgrcv. Нет смысла вращаться в петле, если вы ничего не делаете. Просто заблокируйте, пока клиент не объявит о себе. (И используйте разные типы сообщений для связи от клиента к серверу и от сервера к клиенту - вы не хотите, чтобы клиенты, потреблявшие свои сообщения на сервере, и наоборот).

Во-вторых, переключатель к сокетам потока AF_UNIX, которые предоставят вам accept() способную семантику.

Смежные вопросы