Benutzer mit den meisten Antworten
Named Pipes mit asynchronen Reads und Writes

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.
Antworten
-
Sub AsyncRead()
'Hier wird die Nachricht gedeutet, also in die Console geschrieben
Console.WriteLine("Message:")
Dim TestString As String = ""
For Each Bt In TestBuffer
V, zu diesem AsyncRead-Callback, da fehlt wohl auch der entscheidende Aufruf von EndRead
http://msdn.microsoft.com/en-us/library/system.io.pipes.pipestream.endread.aspx
(beachte auch dessen Rückgabewert)- Als Antwort markiert MAKisBACK Sonntag, 23. Januar 2011 20:14
Alle Antworten
-
Hallo V
ohne Code geprüft: ich denke du möchtest eigentlich ganze 'Meldungen' versenden, aber betreibst die NamedPipe im (default) Byte-Stream Modus. Versuche mal 'Message' Modus:
http://msdn.microsoft.com/en-us/library/system.io.pipes.pipetransmissionmode.aspx
zB via Constructor
http://msdn.microsoft.com/en-us/library/bb335692.aspx
und ReadMode
http://msdn.microsoft.com/en-us/library/system.io.pipes.pipestream.readmode.aspx
-
Sub AsyncRead()
'Hier wird die Nachricht gedeutet, also in die Console geschrieben
Console.WriteLine("Message:")
Dim TestString As String = ""
For Each Bt In TestBuffer
V, zu diesem AsyncRead-Callback, da fehlt wohl auch der entscheidende Aufruf von EndRead
http://msdn.microsoft.com/en-us/library/system.io.pipes.pipestream.endread.aspx
(beachte auch dessen Rückgabewert)- Als Antwort markiert MAKisBACK Sonntag, 23. Januar 2011 20:14