Только один клиент может подключиться к именованному каналу - PullRequest
6 голосов
/ 12 октября 2009

В настоящее время я изучаю именованные каналы в Windows, используя ASP.NET 3.5 и C #. Я написал небольшую серверную программу, которая создает именованный канал:

using (NamedPipeServerStream pipeStream = new NamedPipeServerStream(pipeName))
{
  pipeStream.WaitForConnection();
  // do sth.
}

и клиентское приложение, открывающее канал так:

using (NamedPipeClientStream pipeStream = new NamedPipeClientStream(pipeName))
{ 
  pipeStream.Connect();
  // do sth.
}

Это прекрасно работает, если только один клиент подключается к каналу. Он может как читать, так и писать. Если я пытаюсь подключить второй клиент, код никогда не превышает строку

pipeStream.Connect();

Сервер и все клиенты работают на одном компьютере. Есть идеи?

Большое спасибо заранее!

Ответы [ 4 ]

4 голосов
/ 12 октября 2009

Вы можете посмотреть некоторую информацию здесь: Количество клиентов, которые могут подключиться к именованному каналу

и здесь в MSDN: http://msdn.microsoft.com/en-us/library/aa365594%28VS.85%29.aspx

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

1 голос
/ 13 октября 2009

Спасибо за скорую помощь.

Я уже обрабатывал реальную обработку в отдельных потоках, но забыл упомянуть об этом. Сотрудник обнаружил проблему, хотя:

У меня StreamReader был заключен в другой блок using в опубликованном блоке NamedPipeServerStream-using на стороне сервера

Когда этот блок завершил закрытие StreamReader, он также по какой-то причине отключил NamedPipeServerStream. Также я не включал pipeStream.WaitForConnection () в цикл.

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

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

0 голосов
/ 13 октября 2009

Настоящая труба (та, что в магазине жестких дисков) имеет два конца. Поэтому я ожидаю, что именованный канал также имеет ровно две конечные точки: одну для процесса сервера и одну для процесса клиента.

Однако, независимо от того, какой будет окончательный ответ, я бы посоветовал взглянуть на WCF - он поддерживает сетевое связывание каналов (и многие другие, такие как двоичный TCP, SOAP с или без спецификаций WS- *, просто изменяя конфигурацию ) и обрабатывает активацию сервера и многопоточность для вас. Доступен .net 3.5, поэтому я бы определенно выбрал его.

...