vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
vb@rchiv Offline-Reader - exklusiv auf der vb@rchiv CD Vol.4  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
TCP Stream wirft Bytes durcheinander 
Autor: darksban
Datum: 08.09.12 12:40

Hallo,

ich versuche ein Bild via TCP - Protokoll im lokalen Netzwerk zu verschicken. Der Server befindet sich auf einem Handy und ist in Java geschrieben. Der Client auf einem PC und ist in VB geschrieben. Ich benutze einen Thread um die Daten aus dem Stream zu lesen und in einen Bytearray zu kopieren.

Seltsamerweise geraten die Bytes, die aus dem Stream gelesen werden irgendwann durcheinander. D.h., dass plötzlich z.B. 90 (oder auch mehr) Bytes nicht mehr am Anfang des Pakets stehen, sondern irgendwo mittendrin. Es gehen also keine Bytes verloren.

Noch seltsamer ist die Unregelmäßigkeit, mit der dies auftritt. Ich habe hier kein erkennbares Muster finden können. Meistens tritt dies irgendwann zwischen dem 60.000. und 80.000. Byte zum ersten mal auf. Danach synchronisieren sich die Bytes irgendwann wieder bis es erneut auftritt. Wenn ich die Paketgröße mittels Client.ReceiveBufferSize auf 1 setze wird das Bild korrekt in Empfang genommen.

Der Thread, in dem ich die Daten in Empfang nehme sieht folgendermaßen aus:

    Dim Client As New Net.Sockets.TcpClient
    '...
 
    Private Sub ReceiverThread()
        Dim requestCount As Integer
        Dim i As Long
        Dim read As Integer
        Dim networkStream As NetworkStream = Client.GetStream()
        Client.ReceiveBufferSize = 1024
        Dim bytesFrom(Client.ReceiveBufferSize - 1) As Byte
        Dim file(2688000) As Byte
 
        While (True)
            Try
                Do
                    i = networkStream.Read(bytesFrom, 0, CInt( _
                      Client.ReceiveBufferSize))
                    read += i
                    If i > 0 Then
                        Buffer.BlockCopy(bytesFrom, 0, file, read, _
                          bytesFrom.Length, bytesFrom.Length)
                    End If
                Loop While i > 0
                Application.DoEvents()
                If i = 0 And read > 0 Then
                    Me.Invoke(New WriteTextDelegate(AddressOf WriteText), file, _
                      "Write received file to filestream"))
 
                    Exit While
                end if
            Catch ex As Exception
                MsgBox(ex.Message)
                Exit While
            End Try
        End While
    End Sub
Kann mir jemand sagen, warum hier Pakete durcheinandergeraten, wenn mehr als ein Byte in Empfang genommen wird?

Vielen Dank!
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: TCP Stream wirft Bytes durcheinander 
Autor: ModeratorDaveS (Moderator)
Datum: 08.09.12 18:48

Das erste mal durch muss read doch null sein. Du scheinst übrigens bei Buffer.BlockCopy() einen zusätzlichen Parameter zu haben.

________
Alle Angaben ohne Gewähr. Keine Haftung für Vorschläge, Tipps oder sonstige Hilfe, falls es schiefgeht, nur Zeit verschwendet oder man sonst nicht zufrieden ist

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: TCP Stream wirft Bytes durcheinander 
Autor: darksban
Datum: 08.09.12 20:49

read ist beim ersten Durchgang ja auch 0 bis mit i die Anzahl der ersten gelesenen Bytes addiert wird. Bei Buffer.BlockCopy ist mir leider ein Übertragungsfehler hier ins Forum passiert. Eigentlich lautet die Zeile:

Buffer.BlockCopy(bytesFrom, 0, file, read - bytesFrom.Length, bytesFrom.Length)
In dem Code können eigentlich auch keine groben Fehler sein, da er ja grundsätzlich funktioniert. Zumindest bei den ersten 50-70 Schleifen und dann auch immer wieder längere korrekte Passagen dabei sind und bei der Byte für Byte Übertragung funktioniert er sogar fehlerlos. Ich habe eher das Gefühl, dass ich irgendetwas elementares bei der Übertragung von Bytestreams nicht berücksichtigt habe.

Normalerweise gibt es ja den sogenannten Handshake zwischen Server und Client. Derzeit geht meine Vermutung dahin, dass es irgendwie an dem fehlenden Handshake vor der Übertragung liegen könnte. Noch habe ich in diese Richtung aber nichts gefunden :/

Der Code mit dem ich die Verbindung zum Server hersteller sieht folgendermaßen aus:

        Client = New Net.Sockets.TcpClient
 
        lblStatus.Text = "Versuche Verbindung aufzubauen"
        Try
            Client.Connect("192.168.2.26", 8080)
        Catch ex As Exception
            lblStatus.Text = ("Connection Failure...")
 
        End Try
 
        If Not Client.Connected Then
            lblStatus.Text = ("Connection Failure...")
        Else
            lblStatus.Text = "Connected"
        End If
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: TCP Stream wirft Bytes durcheinander 
Autor: ModeratorDaveS (Moderator)
Datum: 08.09.12 21:22

    read += i
    If i > 0 Then
         Buffer.BlockCopy(bytesFrom, 0, file, read, bytesFrom.Length, _
           bytesFrom.Length)
    End If
read wird immer hochgezählt bevor du Buffer.BlockCopy() ausführst.

________
Alle Angaben ohne Gewähr. Keine Haftung für Vorschläge, Tipps oder sonstige Hilfe, falls es schiefgeht, nur Zeit verschwendet oder man sonst nicht zufrieden ist

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: TCP Stream wirft Bytes durcheinander 
Autor: darksban
Datum: 08.09.12 22:40

Wie ich ja schon im letzten Post geschrieben habe, ist mir leider ein Übertragungfehler passiert. Die Zeile lautet eigentlich:

Buffer.BlockCopy(bytesFrom, 0, file, read - bytesFrom.Length, bytesFrom.Length)
Entschuldigung hierfür :/

Im ersten Durchlauf ist read - bytesFrom.Length = 0.

Bei meinen letzten Versuchen habe ich korrekte Übertragungen zustande bekommen. Ich hatte bislang im Server die Eigenschaft client.setSendBufferSize gleich der Einstellung im Client Client.ReceiveBufferSize. Bei meinen letzten Versuchen habe ich den Wert von setSendBufferSize doppelt so hoch eingestellt wie ReceiveBufferSize. Seitdem sind die Übertragungen korrekt angekommen.

Mir ist zwar noch nicht klar warum es scheinbar so sein muss aber wenigstens scheint es zu funktionieren.

Vielen Dank für deine Hilfe!
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: TCP Stream wirft Bytes durcheinander 
Autor: ModeratorDaveS (Moderator)
Datum: 09.09.12 10:07

Ok, ich habe mich auf deinen esrten Posting bezogen. Richtig wäre aber sowas wie
    If i > 0 Then
         Buffer.BlockCopy(bytesFrom, 0, file, read, i)
         read += i
    End If
(Obwohl die If-Abfrage eigentlich überflüssig ist).

i ist die Anzahl Bytes tatsächlich gelesen. bytesFrom.Length ist die volle Länge des Puffers. Man sollte nicht annehmen die zwei wären immer gleich. (Dieser zweite Fehler ist mir vorher nicht aufgefallen). Und read danach zu inkrementieren ist einfacher als inkrementieren dann wieder subtrahieren.

________
Alle Angaben ohne Gewähr. Keine Haftung für Vorschläge, Tipps oder sonstige Hilfe, falls es schiefgeht, nur Zeit verschwendet oder man sonst nicht zufrieden ist

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel