Использование именованных труб. Несколько клиентов, один сервер, несколько параллельных запросов

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

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

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

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

Этот ответ дает схему псевдокода для одного из способов сделать это.

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

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