none
StreamReader liest nur 4096 Bytes und wartet... RRS feed

  • Frage

  • Hi,

    ich habe das Problem das mein StreamReader Daten aus dem Netzwerk nur bis Position 4096 einliest. Es sollten aber genau 4466 Bytes beim Server ankommen. Ich versuche es z.B. folgendermaßen:

    Private Function StreamReadString(reader As StreamReader, Len As Integer) As String
    
            Dim Stringbuild As New StringBuilder
            Dim read As Boolean = False
            Dim Counter As Integer = 0
            Dim BufferSize As Integer = Len
            Dim Buffer As Char() = New Char(BufferSize - 1) {}
            Dim ReaderCount As Integer = 0
    
            While Not read OrElse reader.Peek() >= 0
                read = True
                'Debug.Write(reader.Read(ByteBuffer, 0, 4))
                Stringbuild.Append(reader.Read)
            End While
            
    ' usw. usw.
    End Sub

    Aber egal welche Variante zum lesen eines Streams ich verwende, bei 4096 ist Schluss und teilweise wird gewartet und gewartet. Hat jemand eine Idee?

    Ach so, der Reader ist vom Typ StreamReader und wurde vorher so instanziiert:

    Dim inStream As Stream = args.Socket.InputStream.AsStreamForRead()
    Dim reader As New StreamReader(inStream)

    Was mache ich beim einlesen falsch bzw. habe ich vergessen? 

    Gruß
    Andy

    Samstag, 28. Oktober 2017 14:19

Alle Antworten

  • Hey,

    aus dem MSDN:

    "If the size of the internal buffer was unspecified when the stream was constructed, its default size is 4 kilobytes (4096 bytes)."

    Es könnte durchaus damit zusammenhängen. Du kannst also probieren, die Größe des internen Buffers zu erhöhen, indem du im StreamReader-Konstruktor einen Wert übergibst.

    Beste Grüße


    Vergiss nicht, die Antwort auf deine Frage zu markieren und hilfreiche Beiträge zu bewerten, damit auch andere schnell die Lösung für ihr Problem finden können - und wir nebenbei noch ein paar Punkte verdienen. :)

    Samstag, 28. Oktober 2017 16:52
  • Hey,

    aus dem MSDN:

    "If the size of the internal buffer was unspecified when the stream was constructed, its default size is 4 kilobytes (4096 bytes)."

    Es könnte durchaus damit zusammenhängen. Du kannst also probieren, die Größe des internen Buffers zu erhöhen, indem du im StreamReader-Konstruktor einen Wert übergibst.

    Beste Grüße


    Vergiss nicht, die Antwort auf deine Frage zu markieren und hilfreiche Beiträge zu bewerten, damit auch andere schnell die Lösung für ihr Problem finden können - und wir nebenbei noch ein paar Punkte verdienen. :)

    Hi,

    das habe ich auch gedacht. Ich habe den Buffer nach oben und unten geschoben, sogar auf den gleichen Wert, wie an Zeichen rüberkommen sollen. Aber nichts, er bleibt in der Schleife "hängen". Counter steht immer auf dem Wert, wie viel auch in Buffer-Size steht. Entweder 4096, oder 256 oder genau 5000.

    So sieht die aktuelle Lese-Schleife aus:

     Counter = reader.Read(Buffer, 0, 256)
            While Counter <> 0
                read = True
                'Debug.Write(reader.Read(ByteBuffer, 0, 4))
                'Stringbuild.Append(reader.Read)
                'Stringbuild.Append(reader.Read(Buffer, 0, 4096))
                Counter = reader.Read(Buffer, 0, 256)
                read = False
    
            End While
            Debug.WriteLine(Stringbuild.Length & " Bytes gelesen...")
    

    Ich komme einfach aus der Schleife nicht raus :-(

    Ich komme mir im Moment total bescheuert vor, solch ein simples Ding hinzubekommen. Entweder sehe ich den Wald vor lauter Baumen nicht mehr, oder... hab alles in den letzten Jahrzehnten gelernte über Nacht komplett vergessen :-/

    Gruß
    Andy

    Samstag, 28. Oktober 2017 19:55
  • Hi Andy,
    ich habe das Szenario mal nachgestellt. Das Problem kann ich nur reproduzieren, wenn der Client von den mehr als 4096 Bytes nur 4096 Bytes versendet und dann, ohne das Socket zu schleißen, auf etwas wartet, z.B. auf eine Quittung über die ersten versendeten 4096 Bytes.

    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Sonntag, 29. Oktober 2017 08:53
  • Guten Morgen Peter,

    ja, ich sende immer Zeilenweise etwas rüber und warte auf ein OK des Servers. Das klappt auch die ersten Zeilen, dann sehe ich im Debugger das der Server ein OK senden WILL, dieses OK kommt auch beim Client an. Aber die Zeile Await writer.FlushAsync arbeitet nicht weiter auf dem Server obwohl ich im Puffer das OK schon sehen kann auf dem Client.

    Muss ich nach jedem Sendevorgang den Socket schließen? Dann würde ja der Sendevorgang sehr lange dauern (öffnen/senden/empfangen/schließen und wieder von vorn). Oder hab ich dich da jetzt missverstanden mit dem "ohne das Socket zu schließen"?

    Gruß
    Andy

    Montag, 30. Oktober 2017 05:48
  • Guten Abend,

    nachdem ich heute hier endlos viele Tests gemacht habe, musste ich feststellen, dass passiert bei mir nach einer bestimmten Anzahl von Paketen, nicht die Menge der Zeichen. Nach 6-7 Paketen ist Schluss. Was aber noch kurioser für mich bei der Fehlersuche wird, ist, dass es mal Clientseitig hakt, mal Serverseitig.

    Ein paar Beispiele:
    - Der String wird vom Client gesendet, beim Server kommt aber nichts an.
    - Beim Server kommt String an, bleibt aber bei WriteAsync("OK") hängen.
    - Der Server konnte WriteAsync("OK") ausführen, bleibt aber bei einem anderen Mal bei FlushAsync() hängen.
    - Oder, Server hat alles geschafft, das OK kommt aber beim Client nicht an.

    Was total seltsam ist, ich kann nichts versenden, was mehr als 1024 Bytes hat. Dann kommt beim Server absolut gar nichts an. Und verkleinere ich den Sende-Buffer von 1024 auf 512, oder 256, dann sind es nach exakt der gleichen "Paketmenge" das nach 6 oder 7 Paketen ein Fehler auftritt.

    Diese 6-7 ist die einzige konstante die ich habe, um zu versuchen, den Fehler einzukreisen.
    Und nein, nix localhost. Der Server ist auf einem Raspberry Pi mit Windows IoT und der Client auf meinem Rechner. Beides schreibe ich selbst. Ich gebe so viele Informationen wie möglich im Debug-Fenster von VS2017 aus. Auf dem linken Bildschirm VS2017 mit dem Client, und dem rechten Bildschirm VS2017 mit dem Server.

    Was könnte ich noch tun, um den Fehler einzukreisen? bzw. was würdet ihr tun? Warum kann ich auch z.B. nicht mehr als 1024 Bytes versenden? SendBufferSize steht standardmäßig bei 8192.

    Gruß
    Andy 

    Dienstag, 31. Oktober 2017 19:43