2011-04-07 19 views
11

Estoy intentando implementar un servidor de canalizaciones con nombre en .NET. El cliente será C++. La naturaleza de los datos enviados no es relevante para la pregunta.Uso de tuberías con nombre. Múltiples clientes, un servidor, múltiples solicitudes paralelas

Mi primera implementación ingenua se ve algo como:

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 
      } 
    } 
} 

¿estoy acercando a este derecho?

¿Qué pasaría si dos clientes abren una conexión al mismo tiempo?

¿Compartirán la misma corriente y se mezclarán los datos?

¿Cómo puedo evitar esto?

Cualquier idea o recurso sobre esto ayudará. Soy bastante nuevo en este tema.

Respuesta

12

Querrá que el servidor maneje conexiones simultáneas de clientes, y que cada cliente se conecte al servidor en una instancia diferente de la tubería, en lugar de intentar hacer todo en una instancia de tubería como lo hace actualmente su código . Cuando el cliente finaliza, desea liberar la instancia del conducto utilizado al hablar con ese cliente, no reutilizarlo.

This answer proporciona un esquema de pseudocódigo de una forma de hacerlo.

También tenga en cuenta que en modo Mensaje, debe leer desde la tubería en un bucle, hasta que la propiedad IsMessageComplete pase a true. Es la única forma de garantizar que recibas cada mensaje completo. También tenga en cuenta que "mensaje" en modo mensaje significa una secuencia de bytes escritos por el emisor en una llamada Write a la tubería.

corrientes cliente no pueden mezclarse entre sí: una instancia de canalización tiene sólo dos extremos, el cliente y el servidor.

+0

+1 Gracias por el asesoramiento. Comienza a tener sentido ahora –

+0

ya que nadie más ha respondido a esto y su respuesta es lo suficientemente buena para mí la aceptaré como la correcta. Gracias. Logré implementar mi servidor de la manera correcta. –

Cuestiones relacionadas