2010-12-31 22 views
14

Hola
Quiero usar NamedPipeServerStream que es nuevo de .NET 3.5 para la comunicación namedpipe. Quiero escribir un servidor de tuberías con múltiples subprocesos. es manejado por defecto o debería escribir código para eso. mi servidor de pipa debe manejar solicitudes múltiples a la vezNamePipeServer multiproceso en C#

¿alguna solución o código?

+0

¿Cuál es el número máximo de solicitud de un cliente a un servidor de canalización con nombre? – Ehsan

+0

No hay límite en la cantidad de lecturas y escrituras que un cliente puede realizar en un conducto con nombre durante el tiempo que ambos extremos del conducto estén abiertos. –

Respuesta

20

Cada instancia de NamedPipeServerStream es una implementación de Stream que envuelve un identificador a una instancia de un canalización con nombre. Puede (y un servidor de pipa multiproceso) tener varias instancias de NamedPipeServerStream para la misma pipa nombrada: cada una envuelve una manija a una instancia diferente de la pipa nombrada, dando servicio a un cliente diferente. Las instancias de canalización nominales (incluso para el mismo conducto) se mantienen separadas por el sistema operativo, por lo que no hay necesidad de ninguna codificación explícita para mantener separada la comunicación de cada cliente con el servidor.

Lo que necesita para codificar explícitamente es el modelo de subprocesamiento para el servidor. El enfoque más simple para multiprocesar el servidor se explica en this SO answer, que incluye una plantilla de pseudo-código. Las implementaciones más escalables, si es necesario admitir un gran número de llamadas simultáneas, utilizarían la agrupación de subprocesos y los métodos asíncronos en lugar de crear una secuencia dedicada para cada conexión.

+0

¿Necesitamos crear una nueva secuencia de servidor para cada cliente? – Ehsan

+1

Sí, es correcto –

0

NamedPipeServerStream es una conexión punto a punto. Debe sincronizar las llamadas usted mismo, por ejemplo, las llamadas escritas en una cola y su servidor lee desde la cola sincronizada y realiza las llamadas.

24

Puede escribir un servidor de tuberías de múltiples hilos creando repetidamente un NamedPipeServerStream y esperando una conexión, y luego generando un hilo para esa instancia de NamedPipeServerStream.

Solo puede tener 254 clientes simultáneos según la documentación de .NET MSDN vinculada a continuación. Para las API de Win32, aunque puede pasar un valor especial para obtener un número ilimitado en función de los recursos del sistema. Parece que la documentación de MSDN es incorrecta, como se indica a continuación.

El código de abajo no se prueban así que por favor no se limitan a copiar y pegar para su uso en producción sin pruebas:

public class PipeServer 
    { 
     bool running; 
     Thread runningThread; 
     EventWaitHandle terminateHandle = new EventWaitHandle(false, EventResetMode.AutoReset); 
     public string PipeName { get; set; } 

     void ServerLoop() 
     { 
      while (running) 
      { 
       ProcessNextClient(); 
      } 

      terminateHandle.Set(); 
     } 

     public void Run() 
     { 
      running = true; 
      runningThread = new Thread(ServerLoop); 
      runningThread.Start(); 
     } 

     public void Stop() 
     { 
      running = false; 
      terminateHandle.WaitOne(); 
     } 

     public virtual string ProcessRequest(string message) 
     { 
      return ""; 
     } 

     public void ProcessClientThread(object o) 
     { 
      NamedPipeServerStream pipeStream = (NamedPipeServerStream)o; 

      //TODO FOR YOU: Write code for handling pipe client here 

      pipeStream.Close(); 
      pipeStream.Dispose(); 
     } 

     public void ProcessNextClient() 
     { 
      try 
      { 
       NamedPipeServerStream pipeStream = new NamedPipeServerStream(PipeName, PipeDirection.InOut, 254); 
       pipeStream.WaitForConnection(); 

       //Spawn a new thread for each request and continue waiting 
       Thread t = new Thread(ProcessClientThread); 
       t.Start(pipeStream); 
      } 
      catch (Exception e) 
      {//If there are no more avail connections (254 is in use already) then just keep looping until one is avail 
      } 
     } 
+0

@Brian: ¿Por qué dices "solo puedes tener 254 clientes concurrentes"? Por defecto, NamedPipeServerStream especifica PIPE_UNLIMITED_INSTANCES al llamar Win32 API CreateNamedPipe, y la documentación de Win32 dice 'el número de instancias de canalización que se pueden crear sólo está limitado por la disponibilidad de resources' sistema. –

+0

'ArgumentOutOfRangeException' se inicia cuando' maxNumberofServerInstances es inferior a uno o mayor que 254. http://msdn.microsoft.com/en-us/library/bb355105.aspx –

+2

@ Brian: La documentación de las mentiras NamedPipeServerStream ctor. El valor '-1', que corresponde a' PIPE_UNLIMITED_INSTANCES', también es un valor aceptable. 'If ​​(((maxNumberOfServerInstances <1) || (maxNumberOfServerInstances> 0xfe)) && (maxNumberOfServerInstances = -1)!) { tiro nueva ArgumentOutOfRangeException ("maxNumberOfServerInstances", SR.GetString ("ArgumentOutOfRange_MaxNumServerInstances")); } ' –