Варианты межсервисной односторонней связи - PullRequest
1 голос
/ 14 февраля 2011

Я ищу различные варианты реализации связи между службой и другими службами / приложениями.

Что бы я хотел сделать :

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

В идеале, клиенты не должны были бы подписываться на получение этих сообщений, что приводит меня к некоторой настройке «широковещания» события (аналогично событиям Windows). Процесс отправки сообщений не должен блокироваться и не нуждается в ответе от каких-либо клиентов (или, что в этом отношении есть даже клиенты).

Я читал об IPC (в частности, COM) и событиях Windows, но еще не наткнулся на то, что действительно соответствует тому, что я хочу сделать.

Так возможно ли это? Если да, то какие технологии мне следует использовать? Если нет, то какие существуют жизнеспособные альтернативы коммуникации?

Вот подробности настройки:

  • Среды Windows 2000 / XP
  • Служба 'Сервер' - это служба Windows, использующая VC ++ 2005
  • Клиенты могут отличаться, но всегда будут в среде Windows (обычными клиентами будут службы Windows VC ++ 6, приложения VB6)

Буду признателен за любую помощь!

Ответы [ 2 ]

1 голос
/ 14 февраля 2011

Windows поддерживает широковещательные сообщения, отметьте здесь . Вы можете SendMessage до HWND_BROADCAST из сервиса и получать его в каждом клиенте.

0 голосов
/ 14 февраля 2011

Существует несколько способов создания системы вещания, но вам придется либо отказаться от надежности (т. Е. Некоторые сообщения должны быть потеряны) , либо использовать правильную систему подписки.

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

В этом варианте вы должны быть осторожны, чтобы иметь дело со случаемчтение клиента в то время как сегмент shmem обновляется должным образом.Один из способов сделать это состоит в том, чтобы иметь два поля порядкового номера в сегменте shmem - одно обновляется до написания нового сообщения, другое после.Клиенты считывают второй порядковый номер до до чтения сообщения, затем перечитывают оба порядковых номера после и проверяют, все ли они равны (и сбрасывают сообщение и повторяют после задержкиесли их нет).Обязательно разместите барьеры памяти вокруг доступа к этим порядковым номерам, чтобы компилятор не переупорядочивал их!

Конечно, все это немного сложно. Именованные каналы намного проще, но требуется подписка (в некотором роде).Сервер вызывает CreateNamedPipe, затем принимает соединения с ConnectNamedPipe.Клиенты используют CreateFile для подключения к каналу сервера.Затем сервер просто зацикливается на отправке данных (используя WriteFile) всем своим клиентам.Обратите внимание, что вам нужно будет создать дополнительный экземпляр канала, используя CreateNamedPipe каждый раз, когда вы принимаете соединение.Пример сервера с именованным каналом можно найти здесь: http://msdn.microsoft.com/en-us/library/aa365588(v=vs.85).aspx

...