Announcement

Collapse
No announcement yet.

Socket Client liefert abgeschnittene Daten

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Socket Client liefert abgeschnittene Daten

    Guten Morgen,

    bei Herumspielen mit Socket-Verbindungen ist mir aufgefallen, dass die Antworten vom Server bei entsprechender Größe abgeschnitten werden. Laut einigen Google-Ergebnissen liegt das wohl daran, dass der Stream schon ausgegeben wird, bevor der Socket Server alles geschickt hat. Als Lösung werden mehrere Varianten empfohlen, den Client so lange loopen zu lassen, bis alle Daten vom Server da sind, der Stream also 0 wird. Allerdings hab ich es nicht geschafft, meinen Code dahingehend anzupassen, daß es funktioniert, die Beispiele, die ich da gefunden habe, bringen mich nicht wirklich weiter. Hier ist mein Code mit While-Schleife, funktioniert aber nicht:
    [highlight=vbnet]
    Dim bytes(512000) As Byte

    ' Connect to a remote device.
    Try
    ' Create a TCP/IP socket.
    Dim sender1 As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
    sender1.SendTimeout = 3000
    sender1.ReceiveTimeout = 35000
    sender1.ReceiveBufferSize = 8192
    ' Connect the socket to the remote endpoint.
    sender1.Connect(TextBox1.Text, TextBox2.Text)
    If sender1.Connected = True Then
    Label1.Text = "Connected to: " & sender1.RemoteEndPoint.ToString()

    End If

    ' Encode the data string into a byte array.
    Dim msg As Byte() = Encoding.ASCII.GetBytes(TextBox3.Text.Trim & vbCrLf)
    'Dim bytesRec As Long = sender1.Receive(bytes) & vbCrLf
    TextBox4.Text = ""
    ' Send the data through the socket.
    Dim bytesSent As Long = sender1.Send(msg)


    Dim bytesRec As Long = sender1.Receive(bytes) & vbCrLf
    TextBox4.Text = ""

    While bytesRec > 0
    TextBox4.Text = Encoding.ASCII.GetString(bytes, 0, bytesRec)
    End While

    ' Release the socket.
    sender1.Shutdown(SocketShutdown.Both)
    sender1.Close()


    Catch ex As Exception
    Debug.Write(ex.Message)
    MsgBox(ex.ToString)
    Button1.Enabled = True
    End Try

    [/highlight]

    Wo liegt der Fehler und wie müsste es richtig sein?

  • #2
    "funktioniert aber nicht" -> ist kein Fehler
    Christian

    Comment


    • #3
      ;-)
      Das Ergebnis von obigem Quelltext: die abgeschnittenen Daten werden angezeigt und dann friert das Programm ein :-(

      Comment


      • #4
        Da du mit

        Dim bytesRec As Long = sender1.Receive(bytes) & vbCrLf

        in einem Rutsch 5120000 Bytes liest, ist da auch keine Schleife, die irgendwie warten könnte. Das du nachher die Daten byteweise ausgibst, führt ja nicht zur Änderung im lesen
        http://stackoverflow.com/questions/1...nd-and-receive
        Christian

        Comment


        • #5
          Den Link hatte ich auch schon gefunden, ebenso die Beispiele bei MSDN, hilft mir aber nicht wirklich weiter :-(
          Was müsste denn jetzt wie angepasst werden, damit es funktioniert?

          Comment


          • #6
            Würde das so machen:
            Buffer mit 8192 Bytes reservieren
            Schleifenstart mit "Sind Bytes Available"
            Lese die Bytes
            Verarbeite die Bytes
            Schleifenende
            Christian

            Comment


            • #7

              Do While sender1.Available > 0
              bytesRec = sender1.Receive(bytes) & vbCrLf
              TextBox4.Text = Encoding.ASCII.GetString(bytes, 0, bytesRec)
              Loop

              bringt kein Ergebnis zurück. Müssen nicht erst Daten gelesen werden, um festzustellen, ob welche da sind?

              Comment


              • #8
                Wozu macht du eine Schleife, um einmalig 512000 Bytes zu lesen?

                Socket.Available-Eigenschaft
                Die Anzahl der Datenbytes, die vom Netzwerk empfangen wurden und zum Lesen zur Verfügung stehen.
                Christian

                Comment


                • #9
                  Nein, es werden ja eben keine 512000 Bytes gelesen, egal ob mit oder ohne Schleife. Setze ich den Puffer z.B. auf 1024 wird garnichts angezeigt. Mit den 512000 wird wenigstens ein Teil angezeigt - was natürlich nicht vollständig ist.
                  Ich verwende ja sender1.available > 0, aber das ändert irgendwie nichts am Verhalten. Aber die Informationsbruchstücke bringen mich wirklich nicht weiter, da fehlt mir der Bezug zu meinem Quellcode oben, ich muss sowas im Ganzen "sehen" um das verstehen ;-)
                  Trotzdem danke!

                  Comment


                  • #10
                    Also wenn ich mir nach
                    Code:
                    bytesRec = sender1.Receive(bytes) & vbCrLf
                    anzeigen lasse, wieviele Bytes empfangen worden sind(mit sender1.available.tostring), dann sind das 1460. Und die werden auch angezeigt. Die tatsächliche Anzahl müsste aber viel größer sein. Heißt das nun, es wurden garnicht mehr Daten vom Server empfangen?

                    Comment


                    • #11
                      Sieht danach aus
                      Christian

                      Comment


                      • #12
                        Neuer Versuch:
                        Code:
                         Dim bytesRec As Integer
                                    bytesRec = sender1.Receive(bytes, sender1.Available, SocketFlags.None) & vbCrLf
                                    wait(2000)
                                    MsgBox(sender1.Available.ToString)
                                    MsgBox(bytesRec.ToString)
                                    TextBox4.Text = Encoding.UTF8.GetString(bytes, 0, bytesRec)
                        wirft mir als erstes 18284 aus, also der Server hat die korrekte Datenmenge geliefert(deswegen die 2 Sekunden Pause, damit die Zeit auch reicht), allerdings wird dann BytesRec mit 0 ausgegeben und die Textbox bleibt natürlich leer... ich verstehs echt nicht

                        Comment


                        • #13
                          Also bevor ich jetzt hier gleich in die Tischkante beiße, wohin müsste denn was genau theoretisch in den Loop damit es funktionieren MÜSSTE?

                          Comment


                          • #14
                            Siehe Beitrag #6

                            Warum nicht mal eine andere Sprache probieren....
                            Christian

                            Comment

                            Working...
                            X