| |
VB.NET - Ein- und UmsteigerTCP 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! | |
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 | |
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! | |
| 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 |
|
|
sevISDN 1.0
Überwachung aller eingehender Anrufe!
Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Weitere InfosTipp des Monats Neu! sevCoolbar 3.0
Professionelle Toolbars im modernen Design!
Mit sevCoolbar erstellen Sie in wenigen Minuten ansprechende und moderne Toolbars und passen diese optimal an das Layout Ihrer Anwendung an (inkl. große Symbolbibliothek) - für VB und MS-Access Weitere Infos
|