Обмен сообщениями многие ко многим на локальной машине без посредника - PullRequest
2 голосов
/ 26 сентября 2011

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

У меня есть следующие проблемытребования:

  1. Должен работать во всех сеансах Windows на одном компьютере.
  2. Должен работать в Windows XP и более поздних версиях.
  3. Глобальная настройка не требуется.
  4. Нет центрального координатора / посредника / сервера.
  5. Не требует повышенных привилегий от приложений.

I не не требует гарантированной доставки сообщений.

Я рассмотрел множество вариантов.Это мой последний запрос об идеях.

Следующие отклонены за нарушение одного или нескольких из указанных выше требований:

ZeroMQ : для выполнения многих-в-многих обмен сообщениями требуется центральный посредник.
Именованные каналы : требуется центральный сервер для приема сообщений и их пересылки.
многоадресные сокеты : требуется правильнонастроенная сетевая карта с действительным IP-адресом, то есть с глобальной конфигурацией.
очередь совместно используемой памяти : для создания разделяемой памяти в глобальном пространстве имен требуются повышенные привилегии.

многоадресные сокеты так почти работает.Что еще можно предложить?Я хотел бы рассмотреть что угодно, от предварительно упакованных библиотек до функциональности Windows API с нуля.


( Редактировать 27 сентября ) Немного больше контекста:

By«центральный координатор / посредник / сервер», я имею в виду отдельный процесс, который должен быть запущен в то время, когда приложение пытается отправить сообщение.Проблема, которую я вижу с этим, состоит в том, что невозможно гарантировать, что этот процесс действительно будет работать, когда это необходимо.Обычно используется служба Windows, но нет способа гарантировать, что определенная служба всегда будет запускаться до того, как пользователь вошел в систему, или гарантировать, что она не была остановлена ​​по какой-либо причине.Запуск по требованию вводит задержку при отправке первого сообщения во время запуска службы и вызывает проблемы с привилегиями.

Многоадресные сокеты почти сработали, потому что удается полностью избежать необходимости в центральном процессе координатора и не требуетповышенные привилегии от приложений, отправляющих или получающих многоадресные пакеты.Но у вас должен быть настроенный IP-адрес - вы не можете выполнять многоадресную передачу на интерфейсе обратной связи (даже если многоадресная передача с TTL = 0 на настроенной сетевой карте ведет себя так, как можно ожидать от многоадресной передачи обратной связи) - и это прерывает сделку.

Ответы [ 4 ]

1 голос
/ 26 сентября 2011

Возможно, я полностью неправильно понимаю проблему, особенно «нет центрального брокера», но рассматривали ли вы что-то на основе пространств кортежей ?

- После обмена комментариями, пожалуйста, подумайтев качестве моего «окончательного» ответа укажите следующее:

Используйте решение на основе файлов и разместите дерево каталогов на Ramdisk , чтобы обеспечить хорошую производительность.

IТакже предлагаем взглянуть на следующее обсуждение StackOverflow (даже если оно основано на Java) для возможных указателей на то, как управлять блокировками и транзакциями в файловой системе.

Этоодин (на основе .NET) тоже может помочь.

0 голосов
/ 11 октября 2011

В конце концов я решил, что одно из трудных требований должно быть выполнено, поскольку проблема не может быть решена каким-либо разумным способом, как было первоначально заявлено.

Мое окончательное решение - служба Windows, работающая с сервером именованных каналов. Любое приложение или служба могут подключиться к экземпляру канала и отправлять сообщения. Любое сообщение, полученное сервером, передается всем экземплярам канала.

Мне очень понравился ответ p.marino, но в итоге это выглядело очень сложно для того, что действительно является очень простой функциональностью.

Еще одна возможность, которая мне понравилась, хотя опять-таки столкнулась с проблемой сложности, заключалась в написании драйвера ядра для управления многоадресной рассылкой. В этом случае было бы возможно несколько механизмов, но затраты на написание безъядерного драйвера ядра были слишком высоки.

0 голосов
/ 26 сентября 2011

Не могли бы вы использовать сокет localhost?

/ Tony

0 голосов
/ 26 сентября 2011

Как насчет UDP вещания ?

...