Несколько клиентов у именованного канала
От: VBDUnit  
Дата: 15.08.14 12:57
Оценка:
Привет всем!

Стоит такая задача (язык C#). Есть основной процесс. К нему могут произвольно подключаться/отключаться другие процессы и передавать текстовые сообщения. Основной процесс тоже может отправлять сообщение, при этом всем подключенным клиентам сразу.

Как это сделать? Если NamedPipes, то можно ли к одному NamedPipeServer прицепить несколько NamedPipeClient? Можно ли динамически подключаться/отключаться? Или через сокеты? Я много гуглил, но ответа конкретно на этот вопрос не нашел, только как соединить два процесса.

Заранее благодарен.
Re: Несколько клиентов у именованного канала
От: fedor.reznik  
Дата: 15.08.14 13:05
Оценка: 2 (1)
Здравствуйте, VBDUnit, Вы писали:

VBD>Привет всем!


VBD>Стоит такая задача (язык C#). Есть основной процесс. К нему могут произвольно подключаться/отключаться другие процессы и передавать текстовые сообщения. Основной процесс тоже может отправлять сообщение, при этом всем подключенным клиентам сразу.


VBD>Как это сделать? Если NamedPipes, то можно ли к одному NamedPipeServer прицепить несколько NamedPipeClient? Можно ли динамически подключаться/отключаться? Или через сокеты? Я много гуглил, но ответа конкретно на этот вопрос не нашел, только как соединить два процесса.


VBD>Заранее благодарен.


Можно, например, сделать через SignalR
пример хоста: http://www.asp.net/signalr/overview/signalr-20/getting-started-with-signalr-20/tutorial-signalr-20-self-host
пример клиента: http://www.asp.net/signalr/overview/signalr-20/hubs-api/hubs-api-guide-net-client
Re[2]: Несколько клиентов у именованного канала
От: VBDUnit  
Дата: 15.08.14 13:13
Оценка:
Здравствуйте, fedor.reznik, Вы писали:



FR>Можно, например, сделать через SignalR

FR>пример хоста: http://www.asp.net/signalr/overview/signalr-20/getting-started-with-signalr-20/tutorial-signalr-20-self-host
FR>пример клиента: http://www.asp.net/signalr/overview/signalr-20/hubs-api/hubs-api-guide-net-client

Большое спасибо, сейчас попробую поиграться, посмотрю что к чему
Re[2]: Несколько клиентов у именованного канала
От: VBDUnit  
Дата: 15.08.14 13:45
Оценка:
Посмотрел, вроде все понятно и просто. Однако:
1) Оно тащит кучу библиотек Microsoft Owin и еще всякие плюшки
2) Оно работает через dynamic.

Фиг с библиотеками, а в от dynamic — насколько сильно он отразится на производительности?
Re[3]: Несколько клиентов у именованного канала
От: fedor.reznik  
Дата: 15.08.14 13:55
Оценка:
Здравствуйте, VBDUnit, Вы писали:

VBD>Посмотрел, вроде все понятно и просто.

И главное можно легко из любой технологии помимо .Net пользовать.
VBD>Однако:
VBD>1) Оно тащит кучу библиотек Microsoft Owin и еще всякие плюшки
Ну так зато куча вещей идет "из коробки"
VBD>2) Оно работает через dynamic.

VBD>Фиг с библиотеками, а в от dynamic — насколько сильно он отразится на производительности?


Очевидно, что будет медленнее чем написать все в рукопашную. Хотя тут тоже смотря как написать
Вообще, мне производительности SignalR всегда хватало за глаза и за уши.

Еще немножко о производительности:

http://www.asp.net/signalr/overview/signalr-20/getting-started-with-signalr-20/tutorial-high-frequency-realtime-with-signalr-20
http://shootr.signalr.net/ — real-time игруха, например.
Re: Несколько клиентов у именованного канала
От: AngeL B. Россия  
Дата: 15.08.14 17:50
Оценка:
Здравствуйте, VBDUnit, Вы писали:

VBD>Как это сделать? Если NamedPipes, то можно ли к одному NamedPipeServer прицепить несколько NamedPipeClient?

Одновременно нельзя. По определению понятия NamedPipe.
Если нужны соединения с несколькими клиентами, то нужно под каждое одновременно открытое соединение создавать свой экземпляр NamedPipe (с таким же именем как и предыдущий). Создание экземпляров NamedPipe можно производить статически в начале работы программы (если максимальное число подключений не велико) или динамически по мере подключения клиентов.
Чтобы отправить сообщения всем подключенным клиентам, надо отправить его во все каналы с активными клиентами (мультикаста для именованных каналов, насколько я помню, нет).

Насчет SignalR. Это модно, но учти, что он работает поверх HTTP протокола, т.е. имеет большой оверхед. Если задача — маленький чатик, то он подойдет. Если же передаваемые объемы данных велики или критично время реакции, то тогда именованные каналы, они значительно более низкоуровневы.
Re[2]: Несколько клиентов у именованного канала
От: Pavel Dvorkin Россия  
Дата: 16.08.14 02:48
Оценка:
Здравствуйте, AngeL B., Вы писали:

AB>Если нужны соединения с несколькими клиентами, то нужно под каждое одновременно открытое соединение создавать свой экземпляр NamedPipe (с таким же именем как и предыдущий). Создание экземпляров NamedPipe можно производить статически в начале работы программы (если максимальное число подключений не велико) или динамически по мере подключения клиентов.


Хм...

Насколько я понимаю, можно указать число инстансов.

http://msdn.microsoft.com/ru-ru/library/bb335692(v=vs.110).aspx

AB>Чтобы отправить сообщения всем подключенным клиентам, надо отправить его во все каналы с активными клиентами (мультикаста для именованных каналов, насколько я помню, нет).


С этим согласен.
With best regards
Pavel Dvorkin
Re[3]: Несколько клиентов у именованного канала
От: AngeL B. Россия  
Дата: 16.08.14 13:51
Оценка: +2
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Насколько я понимаю, можно указать число инстансов.

PD>http://msdn.microsoft.com/ru-ru/library/bb335692(v=vs.110).aspx
это максимальное число экземпляров с одним именем, которые вообще можно будет создать за все время работы.
Оно должно быть указано во время первого создания и в дальнейшем должно быть точно таким же.
И это не отменяет необходимости создания каждого отдельного экземпляра канала под каждого отдельного одновременно подключенного клиента.

Если хотите более подробно, то параметр maxNumberOfServerInstances восходит к параметру nMaxInstances функции CreateNamedPipe из Win32 API.
Re[3]: Несколько клиентов у именованного канала
От: TK Лес кывт.рф
Дата: 18.08.14 13:56
Оценка: 2 (1)
Здравствуйте, VBDUnit, Вы писали:

VBD>Фиг с библиотеками, а в от dynamic — насколько сильно он отразится на производительности?


Dynamic на производитеьности сказывается минимально — под каждый конкретный тип будет создана своя версия кода (т.е. основные потери только при первом вызове)
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[2]: Несколько клиентов у именованного канала
От: TK Лес кывт.рф
Дата: 18.08.14 14:00
Оценка:
Здравствуйте, AngeL B., Вы писали:

AB>Чтобы отправить сообщения всем подключенным клиентам, надо отправить его во все каналы с активными клиентами (мультикаста для именованных каналов, насколько я помню, нет).


Классические Named Pipe могут работать как в Stream так и Message режимах.
Message режим не гарантирует доставки попозволяет делать Multicast рассылки.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[3]: Несколько клиентов у именованного канала
От: AngeL B. Россия  
Дата: 20.08.14 10:30
Оценка:
Здравствуйте, TK, Вы писали:

AB>>Чтобы отправить сообщения всем подключенным клиентам, надо отправить его во все каналы с активными клиентами (мультикаста для именованных каналов, насколько я помню, нет).

TK>Классические Named Pipe могут работать как в Stream так и Message режимах.
TK>Message режим не гарантирует доставки попозволяет делать Multicast рассылки.

Ты не путаешь их с почтовыми слотами (MailSlots)?
Если нет, тогда дай ссылку на документацию по единовременной (с помощью вызова одной функции один раз) рассылке нескольким клиентам.

Пояснение: Каждый отдельный экземпляр NamedPipe имеет свой собственный дескриптор (HANDLE), так что для одновременной рассылки нескольким клиентам должна быть функция, принимающая в качестве параметра либо массив HANDLE-ов, либо имя именованного канала. Другое невозможно, т.к. единого дескриптора у набора каналов нет. Такой функции я не помню.
Re[4]: Несколько клиентов у именованного канала
От: TK Лес кывт.рф
Дата: 20.08.14 12:53
Оценка:
Здравствуйте, AngeL B., Вы писали:

AB>Ты не путаешь их с почтовыми слотами (MailSlots)?


Действительно
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re: Несколько клиентов у именованного канала
От: Danchik Украина  
Дата: 20.08.14 14:34
Оценка:
Здравствуйте, VBDUnit, Вы писали:

VBD>Привет всем!


VBD>Стоит такая задача (язык C#). Есть основной процесс. К нему могут произвольно подключаться/отключаться другие процессы и передавать текстовые сообщения. Основной процесс тоже может отправлять сообщение, при этом всем подключенным клиентам сразу.


VBD>Как это сделать? Если NamedPipes, то можно ли к одному NamedPipeServer прицепить несколько NamedPipeClient? Можно ли динамически подключаться/отключаться? Или через сокеты? Я много гуглил, но ответа конкретно на этот вопрос не нашел, только как соединить два процесса.


VBD>Заранее благодарен.


ZeroMQ вам в помощь

http://zeromq.org/bindings:clr
Re: Несколько клиентов у именованного канала
От: VladCore  
Дата: 20.08.14 15:21
Оценка:
Здравствуйте, VBDUnit, Вы писали:

VBD>Привет всем!


VBD>Стоит такая задача (язык C#). Есть основной процесс. К нему могут произвольно подключаться/отключаться другие процессы и передавать текстовые сообщения. Основной процесс тоже может отправлять сообщение, при этом всем подключенным клиентам сразу.


VBD>Как это сделать? Если NamedPipes, то можно ли к одному NamedPipeServer прицепить несколько NamedPipeClient? Можно ли динамически подключаться/отключаться? Или через сокеты? Я много гуглил, но ответа конкретно на этот вопрос не нашел, только как соединить два процесса.


VBD>Заранее благодарен.


Пайпами на каждую пару клиент-сервер лучше открывать отдельный канал. Почему не помню. Глючит если много клиентов на канале?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.