C #: Entendimiento asincrónico de NamedPipeServerStream
Estaba tratando de encontrar cualquier ejemplo bueno y claro de NamedPipeServerStream asíncrono y no pude encontrar ninguno adecuado para mí.
Quiero tener el Servidor NamedPipe, que es aceptar de forma asíncrona los mensajes de los clientes. El cliente es simple y está bien para mí. Pero no puedo encontrar ejemplos de servidor, o no puedo entender cómo funciona.
Ahora, según tengo entendido, necesito crear el objeto NamedPipeServerStream. Hagámoslo:
namedPipeServerStream = new NamedPipeServerStream(PIPENAME, PipeDirection.In, 1, PipeTransmissionMode.Byte, PipeOptions.Asynchronous, BUFFERSIZE, BUFFERSIZE);
Parece funcionar.Pero no sé, ¿tengo que usar PipeSecurity o PipeAccessRule? ¿Yo? Mi servidor funcionará como un servicio de Windows en un sistema local.
¿Qué sigue? Estoy pensando que necesito usar BeginWaitForConnection para conexiones asíncronas. Veamos:
namedPipeServerStream.BeginWaitForConnection(WaitForConnectionAsyncCallback, <some strange thing>);
Pregunta 1: ¿Qué es esto "algo extraño"? ¿Cómo usarlo?
Pregunta 2: Deberia hacer
while(true)
{
namedPipeServerStream.BeginWaitForConnection(WaitForConnectionAsyncCallback, <some strange thing>);
}
¿Para que mi servidor espere siempre las conexiones? O necesito hacerlo de otra manera?
Y luego ... Echemos un vistazo a la función WaitForConnectionAsyncCallback:
private void WaitForConnectionAsyncCallback(IAsyncResult result)
{
Console.WriteLine("Client connected.");
byte[] buff = new byte[BUFFERSIZE];
namedPipeServerStream.Read(buff, 0, namedPipeServerStream.InBufferSize);
string recStr = General.Iso88591Encoding.GetString(buff, 0, namedPipeServerStream.InBufferSize);
Console.WriteLine(" " + recStr);
namedPipeServerStream.EndWaitForConnection(result);
}
..Esto no funciona, por supuesto. PorqueNo sé exactamente cómo recibir la cadena de la secuencia. ¿Cómo? Ahora se levanta una InvalidOperationException:
Pipe aún no ha sido conectado.
Entonces, ¿cómo organizar el trabajo asíncrono con NamedPipeServerStream?