none
Named Pipes mit asynchronen Reads und Writes RRS feed

  • Frage

  • Hallo,

    ich habe eine Frage zu Named Pipes.

    Ich habe zwei Konsolenanwendungen erstellt (Aus Ausprobierzwecken). Eine ist der NamedPipe-Client und die andere der NamedPipe-Server.

    Soweit so gut.

    Die Kommunikation funktioniert schonmal, aber:
    Ich versuche, mit einem asynchronen BeginRead des Clients eine Art Schleife zu erzeugen. Wenn eine Nachricht reinkommt, wird sie immer abgefangen, und muss nicht explizit schrittweise für spezielle Zwecke abgehandelt werden (Muss also nicht tonnenweise Code schreiben, um eine Nachricht speziell zu deuten).

    Hier der Source:

    Der Server:

    Module Module1
    
      'Die NamedPipe
      Friend ThisPipe As New IO.Pipes.NamedPipeServerStream("HALLOTEST")
    
      Sub Main()
        Console.WriteLine("Connecting with client...")
        ThisPipe.WaitForConnection()
        Console.WriteLine("Connection established.")
        Console.WriteLine("Sending Testmessage. Bytes: 143 255 212 78 4 99")
    
        'Die Testnachricht
        Dim TestBuffer(5) As Byte
        TestBuffer(0) = 143
        TestBuffer(1) = 255
        TestBuffer(2) = 212
        TestBuffer(3) = 78
        TestBuffer(4) = 4
        TestBuffer(5) = 99
    
        ThisPipe.Write(TestBuffer, 0, 6)
        Console.WriteLine("Sent bytes.")
        ThisPipe.WaitForPipeDrain()
        Console.WriteLine("Message received.")
    
        ThisPipe.Write(TestBuffer, 0, 6)
        Console.WriteLine("Sent bytes.")
        ThisPipe.WaitForPipeDrain()
        Console.WriteLine("Message received.")
        Console.Read()
      End Sub
    
    End Module
     

    Der Client:

    Module Module1
    
      Friend ThisPipe As New IO.Pipes.NamedPipeClientStream("HALLOTEST")
      Private TestBuffer(5) As Byte
    
      Sub Main()
        Console.WriteLine("Connecting with server...")
        ThisPipe.Connect()
        Console.WriteLine("Connection established.")
        Console.WriteLine("Listen testmessage.")
    
        ThisPipe.BeginRead(TestBuffer, 0, 6, New AsyncCallback(AddressOf AsyncRead), "Hallo")    'Der String Hallo ist unwichtig
        
        Console.Read()
      End Sub
    
      Sub AsyncRead()
    
        'Hier wird die Nachricht gedeutet, also in die Console geschrieben
        Console.WriteLine("Message:")
        Dim TestString As String = ""
    
        For Each Bt In TestBuffer
          TestString &= CStr(Bt) & " "
        Next
    
        Console.WriteLine(TestString)
    
        'Der rekursive Aufruf zum Abfangen der nächsten Nachricht.
        ThisPipe.BeginRead(TestBuffer, 0, 6, New AsyncCallback(AddressOf AsyncRead), "Hallo")
    
      End Sub
    
    End Module


    Das Problem:
    Bei dem Server wird die Testnachricht zweimal versandt. Doch die zweite Testnachricht kommt nicht an, obwohl ich wieder den asynchronen Lesevorgang ausgelöst habe (nachdem er schon einmal ausgelöst wurde). Was mache ich falsch?

    Ich danke für Hilfe.

    Samstag, 22. Januar 2011 20:32

Antworten

Alle Antworten