Maximale Länge eines Strings ist 8kB !?

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Pascal.

    Maximale Länge eines Strings ist 8kB !?

    Hi!

    (Bin mir nicht sicher, ob das ein .net Porb. ist)

    Ich wollte mit .net die Antwort eines Apache-Servers (inkulsive Website-Inhalt) in einen String speichern und bin mit verwunderung darauf gestoßen, dass bei genau 8kB der String einfach zu Ende ist.

    Jez wollt ich hald fragen, ob das wirklich so ist, oder ob ich irgendwo nen Fehler in nem Code-Teil hab.
    Und wie man das umgeht. Ich muss nämlich in dem gesamten Teil etwas suchen (.IndexOf)...


    Danke schonmal ;)
    Bei VB 6 beträgt die maximale String Länge 2 Gigabyte (GB). Das sollte bei .NET auch noch so sein. Ich denke mal, bei deinem Beispiel kommen immer 8 KB gleichzeitig an. Ist beim Winsock-Control glaube ich auch so (das kommt also in "Chunks" an).
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Hab gelesen das bei net die Strings auf 65535 Zeichen begrenzt sind. Nehm doch stattdessen eine Textbox oder einr RichTextBox, die sind bestimmt nicht begrenzt...
    Gruß, Agent Smith 8-)

    activeFlags = (lazy OR weary)

    Lemgo-Verschwörung | Mathematics | VB-Paradise in blau
    @ Agent:
    TextBox / Richtextbox macht keinen unterschied, da ich ja im string suche.
    habs trotzdem versucht und da kommen genauso die 8kB an.


    @ marcus:
    Wie genau ist das mit den chunks ?

    Ich hab aus nem Beispiel heraus folgende Funktion gebastelt (gibt ja kein Winsock-Control mehr):

    VB.NET-Quellcode

    1. Dim Ret As String = ""
    2. Dim tcpClient As New System.Net.Sockets.TcpClient()
    3. tcpClient.Connect(Host, Port)
    4. Dim networkStream As NetworkStream = tcpClient.GetStream()
    5. If networkStream.CanWrite And networkStream.CanRead Then
    6. ' Write Request
    7. Dim sendBytes As [Byte]() = Encoding.ASCII.GetBytes(Request)
    8. networkStream.Write(sendBytes, 0, sendBytes.Length)
    9. ' Read the NetworkStream into a byte buffer.
    10. Dim bytes(tcpClient.ReceiveBufferSize) As Byte
    11. networkStream.Read(bytes, 0, CInt(tcpClient.ReceiveBufferSize))
    12. Ret = Encoding.ASCII.GetString(bytes)
    13. Else
    14. 'Error while connecting!!
    15. MessageBox.Show("Error while connecting!!")
    16. End If
    17. Return Ret



    Lieg ich richtig, dass ich den Teil

    VB.NET-Quellcode

    1. ' Read the NetworkStream into a byte buffer.
    2. Dim bytes(tcpClient.ReceiveBufferSize) As Byte
    3. networkStream.Read(bytes, 0, CInt(tcpClient.ReceiveBufferSize))


    einfach solange durchlaufen lassen soll, bis der buffer 0 zeichen lang ist !?


    [EDITED]
    Also das funzt mal nicht... ich nehm an, dass ich irgendwie den Buffer neu einlesen muss -.-
    Aber WIE !???
    [/EDITED]

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Mad Andy“ ()

    In einer Schleife durchlaufen ist richtig, und zwar so lange bis Größe(gelesene Bytes) <> MAX_BUFFER_LENGTH.

    In API-erstellten Sockets unter VB 6 war MAX_BUFFER_LENGTH 8192 (was Deinen 8kb entspricht), das müsste in .net genauso sein. Weiterhin hat das Lesen von Sockets als Rückgabewert die Anzahl der gelesenen Bytes geliefert, das ganze Spiel hab ich dann so lange betrieben bis der Rückgabewert < 8192 war.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Pascal“ ()

    ja... hab ich mir auch gedacht...

    Aber mit .Read bekommt man immer das gleiche -.-
    Also der Buffer wird nicht neu eingelesen.

    Es gibt auch die Methoden BeginRead und EndRead.
    vllt. sind die dafür ???

    Hast du vllt. ne idee?
    Sorry für das Pushen...

    Aber hat echt keiner ne Anhnung, wie das unter .net geht !?
    Is ziehmlich wichtig -.-
    Und die MSDN spuckt auch nur Müll aus...


    ______________________
    Also in der MSDN (hab doch was gefunden) steht, dass man das Lesen in folgende Schleife geben muss:

    VB.NET-Quellcode

    1. Do
    2. 'Daten auslesen
    3. Loop While networkStream.DataAvailable


    Das Problem ist nur, dass die eigenschaft .DataAvailable von anfang an auf false is oO


    ______________________
    Hmm...
    Wenn ich das Beispiel aus der MSDN 1:1 kopiere, kommt genau der Read-Buffer von dem Beispiel (1024 Byte) an Oo

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Mad Andy“ ()

    Sorry, ich war/bin krank und deswegen nur selten im Netz. Heiße Zitrone mit Zucker ist angesagt.

    Das Beispiel aus der MSDN kann ich nicht probieren, weil ich VS 6 installiert habe. Prinzipiell kann ich folgendes von mir geben, in der Hoffnung es hilft Dir weiter :

    1. Den Buffer legst Du selbst fest, also kannst Du ihn auch auf 8192 erweitern als MAX_BUFFER_LENGTH

    2. Dein Byte-Array enthält dann Daten im Bereich (0) bis (8191), also kannst Du es mit einer Schleife durchlaufen. Nicht nur in Array(0) werden Daten geschrieben, sondern nur jeweils 1 Byte.

    Vielleicht ist das der einzige Trick.