Использование именованных каналов.Несколько клиентов, один сервер, несколько параллельных запросов - PullRequest
14 голосов
/ 07 апреля 2011

Я пытаюсь реализовать сервер именованных каналов в .NET.Клиент будет C ++.Характер отправляемых данных не имеет отношения к вопросу.

Моя первая наивная реализация выглядит примерно так:

using (NamedPipeServerStream stream = 
                new NamedPipeServerStream(PipeName,
                                          PipeDirection.InOut, 
                                          numberOfListeners,
                                          PipeTransmissionMode.Message))
{
     while (true)
     {
          try
          {
              stream.WaitForConnection();

              var request = ReadRequest(stream);

              var reply = Process(request);
              WriteReply(stream, reply);
              stream.WaitForPipeDrain();
          }
          catch (Exception ex)
          {
              //TO DO: log
          }
     }
 }

Подхожу ли я к этому праву?

Что будет, если два клиента одновременно откроют соединение?

Будет ли они использовать один и тот же поток, и данные будут смешаны?

Как мне избежать этого?

Любые идеи или ресурсы по этому вопросу помогут.Я довольно новичок в этой теме.

1 Ответ

14 голосов
/ 07 апреля 2011

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

Этот ответ дает набросок псевдокода одного из способов сделать это.

Также обратите внимание, что в режиме сообщений вам нужно читать из канала в цикле, пока свойство IsMessageComplete не станет true. Это единственный способ гарантировать, что вы получите каждое полное сообщение. Также имейте в виду, что «сообщение» в режиме сообщений означает поток байтов, записанных отправителем за один Write вызов канала.

Клиентские потоки не могут смешиваться друг с другом: экземпляр канала имеет только два конца, THE клиент и THE сервер.

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