Очереди сообщений POSIX или сокеты домена unix для локального IPC

Мне нужно настроить локальный IPC между клиентом и сервером. Это случай одного сервера и нескольких клиентов, и данные должны обмениваться в обоих направлениях. Клиент - это команда, которая отправляет параметры команды, а сервер извлекает данные и отправляет их клиенту. Клиент выводит на консоль вывод, полученный с сервера.

Данные, отправленные командой, малы, но данные, отправленные сервером команде, огромны (~ 11 МБ). Существующий дизайн в Windows отправляет данные кусками по 65 килобайт с использованием именованных каналов. Серверу необходимо отправлять данные нескольким клиентам одновременно, так как обычно выполняются команды с разными параметрами одновременно с разных терминалов.

Я пропустил FIFO, поскольку данные из нескольких процессов могут чередоваться для сообщений размером более 4096 байт. Пожалуйста, поправьте меня, если я ошибаюсь.

Учитывая два нижеприведенных критерия, что было бы лучшим выбором: очереди сообщений POSIX или сокеты домена unix?

  1. размер (65К) сообщения
  2. данные от нескольких клиентов не должны чередоваться. Клиент должен получать только данные, адресованные этому клиенту.

Пожалуйста, дайте мне знать, если вам нужны более подробные сведения.

С уважением, Рохини Чандра


person rohini chandra    schedule 29.12.2010    source источник


Ответы (1)


Похоже, вам нужна розетка. Настройте сокет на сервере с помощью bind, затем, когда каждый клиент подключается к нему, сервер может либо выполнить вилку для обработки каждого клиента индивидуально, либо использовать select для обработки клиентов. Разветвление обычно проще:

  int sock = create and bind the socket to any port

  while (1) {
    int client = accept(sock);
    pid_t pid = fork()
    if (pid == 0) {
       // Handle client command
       exit(0);
    }
  }
person Daniel Gallagher    schedule 30.12.2010
comment
Спасибо за предложение, Даниэль. Не могли бы вы сообщить мне, какой из критериев, по вашему мнению, лучше всего подходит для сокетов домена unix. Я прошу ради обучения. - person rohini chandra; 30.12.2010
comment
Сокеты будут автоматически разделять разные потоки данных клиентов. Каждый раз, когда клиент подключается, сервер создает новый временный сокет и оставляет исходный серверный сокет доступным для новых клиентов. С очередями сообщений вам придется реализовать собственное разделение. Кроме того, сокеты используют стандартные системные вызовы POSIX read () и write (), поэтому они будут более понятны специалистам по обслуживанию. - person Daniel Gallagher; 30.12.2010
comment
Спасибо, Даниэль. Я подумал, что, поскольку очереди сообщений Linux предоставляют дескриптор файла при открытии очереди сообщений, у нас может быть новый дескриптор для каждого клиента. Но для того, чтобы это работало, я думаю, что ОС должна поддерживать это разделение, как это делают окна Named Pipes по своей сути. Я не был уверен, справятся ли с этим очереди сообщений Linux. - person rohini chandra; 31.12.2010
comment
Хотя у каждого клиента есть собственный дескриптор очереди сообщений, это всегда одна и та же очередь. Поэтому, когда сервер записывает данные в очередь, ваши клиенты должны будут знать, предназначено ли сообщение для них, прежде чем удалять его из очереди, поскольку все клиенты читают из одной очереди. - person Daniel Gallagher; 31.12.2010