Стоит такая задача (язык C#). Есть основной процесс. К нему могут произвольно подключаться/отключаться другие процессы и передавать текстовые сообщения. Основной процесс тоже может отправлять сообщение, при этом всем подключенным клиентам сразу.
Как это сделать? Если NamedPipes, то можно ли к одному NamedPipeServer прицепить несколько NamedPipeClient? Можно ли динамически подключаться/отключаться? Или через сокеты? Я много гуглил, но ответа конкретно на этот вопрос не нашел, только как соединить два процесса.
Здравствуйте, VBDUnit, Вы писали:
VBD>Привет всем!
VBD>Стоит такая задача (язык C#). Есть основной процесс. К нему могут произвольно подключаться/отключаться другие процессы и передавать текстовые сообщения. Основной процесс тоже может отправлять сообщение, при этом всем подключенным клиентам сразу.
VBD>Как это сделать? Если NamedPipes, то можно ли к одному NamedPipeServer прицепить несколько NamedPipeClient? Можно ли динамически подключаться/отключаться? Или через сокеты? Я много гуглил, но ответа конкретно на этот вопрос не нашел, только как соединить два процесса.
VBD>Заранее благодарен.
Здравствуйте, VBDUnit, Вы писали:
VBD>Посмотрел, вроде все понятно и просто.
И главное можно легко из любой технологии помимо .Net пользовать. VBD>Однако: VBD>1) Оно тащит кучу библиотек Microsoft Owin и еще всякие плюшки
Ну так зато куча вещей идет "из коробки" VBD>2) Оно работает через dynamic.
VBD>Фиг с библиотеками, а в от dynamic — насколько сильно он отразится на производительности?
Очевидно, что будет медленнее чем написать все в рукопашную. Хотя тут тоже смотря как написать
Вообще, мне производительности SignalR всегда хватало за глаза и за уши.
Здравствуйте, VBDUnit, Вы писали:
VBD>Как это сделать? Если NamedPipes, то можно ли к одному NamedPipeServer прицепить несколько NamedPipeClient?
Одновременно нельзя. По определению понятия NamedPipe.
Если нужны соединения с несколькими клиентами, то нужно под каждое одновременно открытое соединение создавать свой экземпляр NamedPipe (с таким же именем как и предыдущий). Создание экземпляров NamedPipe можно производить статически в начале работы программы (если максимальное число подключений не велико) или динамически по мере подключения клиентов.
Чтобы отправить сообщения всем подключенным клиентам, надо отправить его во все каналы с активными клиентами (мультикаста для именованных каналов, насколько я помню, нет).
Насчет SignalR. Это модно, но учти, что он работает поверх HTTP протокола, т.е. имеет большой оверхед. Если задача — маленький чатик, то он подойдет. Если же передаваемые объемы данных велики или критично время реакции, то тогда именованные каналы, они значительно более низкоуровневы.
Здравствуйте, AngeL B., Вы писали:
AB>Если нужны соединения с несколькими клиентами, то нужно под каждое одновременно открытое соединение создавать свой экземпляр NamedPipe (с таким же именем как и предыдущий). Создание экземпляров NamedPipe можно производить статически в начале работы программы (если максимальное число подключений не велико) или динамически по мере подключения клиентов.
Хм...
Насколько я понимаю, можно указать число инстансов.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Насколько я понимаю, можно указать число инстансов. PD>http://msdn.microsoft.com/ru-ru/library/bb335692(v=vs.110).aspx
это максимальное число экземпляров с одним именем, которые вообще можно будет создать за все время работы.
Оно должно быть указано во время первого создания и в дальнейшем должно быть точно таким же.
И это не отменяет необходимости создания каждого отдельного экземпляра канала под каждого отдельного одновременно подключенного клиента.
Если хотите более подробно, то параметр maxNumberOfServerInstances восходит к параметру nMaxInstances функции CreateNamedPipe из Win32 API.
Здравствуйте, VBDUnit, Вы писали:
VBD>Фиг с библиотеками, а в от dynamic — насколько сильно он отразится на производительности?
Dynamic на производитеьности сказывается минимально — под каждый конкретный тип будет создана своя версия кода (т.е. основные потери только при первом вызове)
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Здравствуйте, AngeL B., Вы писали:
AB>Чтобы отправить сообщения всем подключенным клиентам, надо отправить его во все каналы с активными клиентами (мультикаста для именованных каналов, насколько я помню, нет).
Классические Named Pipe могут работать как в Stream так и Message режимах.
Message режим не гарантирует доставки попозволяет делать Multicast рассылки.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Здравствуйте, TK, Вы писали:
AB>>Чтобы отправить сообщения всем подключенным клиентам, надо отправить его во все каналы с активными клиентами (мультикаста для именованных каналов, насколько я помню, нет). TK>Классические Named Pipe могут работать как в Stream так и Message режимах. TK>Message режим не гарантирует доставки попозволяет делать Multicast рассылки.
Ты не путаешь их с почтовыми слотами (MailSlots)?
Если нет, тогда дай ссылку на документацию по единовременной (с помощью вызова одной функции один раз) рассылке нескольким клиентам.
Пояснение: Каждый отдельный экземпляр NamedPipe имеет свой собственный дескриптор (HANDLE), так что для одновременной рассылки нескольким клиентам должна быть функция, принимающая в качестве параметра либо массив HANDLE-ов, либо имя именованного канала. Другое невозможно, т.к. единого дескриптора у набора каналов нет. Такой функции я не помню.
Здравствуйте, VBDUnit, Вы писали:
VBD>Привет всем!
VBD>Стоит такая задача (язык C#). Есть основной процесс. К нему могут произвольно подключаться/отключаться другие процессы и передавать текстовые сообщения. Основной процесс тоже может отправлять сообщение, при этом всем подключенным клиентам сразу.
VBD>Как это сделать? Если NamedPipes, то можно ли к одному NamedPipeServer прицепить несколько NamedPipeClient? Можно ли динамически подключаться/отключаться? Или через сокеты? Я много гуглил, но ответа конкретно на этот вопрос не нашел, только как соединить два процесса.
VBD>Заранее благодарен.
Здравствуйте, VBDUnit, Вы писали:
VBD>Привет всем!
VBD>Стоит такая задача (язык C#). Есть основной процесс. К нему могут произвольно подключаться/отключаться другие процессы и передавать текстовые сообщения. Основной процесс тоже может отправлять сообщение, при этом всем подключенным клиентам сразу.
VBD>Как это сделать? Если NamedPipes, то можно ли к одному NamedPipeServer прицепить несколько NamedPipeClient? Можно ли динамически подключаться/отключаться? Или через сокеты? Я много гуглил, но ответа конкретно на этот вопрос не нашел, только как соединить два процесса.
VBD>Заранее благодарен.
Пайпами на каждую пару клиент-сервер лучше открывать отдельный канал. Почему не помню. Глючит если много клиентов на канале?