C #: zrozumienie asynchronicznego NamedPipeServerStream
Próbowałem znaleźć dobry i jasny przykład asynchronicznego NamedPipeServerStream i nie mogłem znaleźć żadnego odpowiedniego dla mnie.
Chcę mieć serwer NamedPipe, który asynchronicznie akceptuje wiadomości od klientów. Klient jest prosty i dla mnie w porządku. Ale nie mogę znaleźć przykładów serwera lub nie mogę zrozumieć, jak to działa.
Teraz, jak rozumiem, muszę utworzyć obiekt NamedPipeServerStream. Zróbmy to:
namedPipeServerStream = new NamedPipeServerStream(PIPENAME, PipeDirection.In, 1, PipeTransmissionMode.Byte, PipeOptions.Asynchronous, BUFFERSIZE, BUFFERSIZE);
Wydaje się działać.Ale nie wiem, czy w ogóle muszę używać PipeSecurity lub PipeAccessRule? Czy ja? Mój serwer będzie działał jako usługa systemu Windows w systemie lokalnym.
Co następne? Myślę, że muszę użyć BeginWaitForConnection dla asynchronicznych połączeń. Zobaczmy:
namedPipeServerStream.BeginWaitForConnection(WaitForConnectionAsyncCallback, <some strange thing>);
Pytanie 1: Co to za „dziwna rzecz”? Jak tego użyć?
pytanie 2: Czy powinnam
while(true)
{
namedPipeServerStream.BeginWaitForConnection(WaitForConnectionAsyncCallback, <some strange thing>);
}
Aby mój serwer zawsze czekał na połączenia? Czy muszę to zrobić jakoś inaczej?
A potem ... Przyjrzyjmy się funkcji 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);
}
.. To oczywiście nie działa. BoNie wiem, jak dokładnie odebrać ciąg ze strumienia. W jaki sposób? Teraz podnosi wyjątek InvalidOperationException:
Rura nie została jeszcze podłączona.
Jak więc zorganizować asynchroniczną pracę z NamedPipeServerStream?