Только один клиент может подключиться к именованному каналу

В настоящее время я изучаю именованные каналы в 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();

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

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


person Shackles    schedule 12.10.2009    source источник


Ответы (4)


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

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

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

person 0100110010101    schedule 12.10.2009

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

Я уже занимался реальной обработкой в ​​отдельных потоках, но забыл об этом упомянуть. Однако коллега обнаружил проблему:

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

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

person Shackles    schedule 12.10.2009
comment
так что можете закрыть вопрос)) - person 0100110010101; 13.10.2009

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

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

person Marc Wittke    schedule 12.10.2009

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

person Brian R. Bondy    schedule 20.02.2011