| |
| In diesem Forum haben Sie die Möglichkeit Kommentare, Fragen und Verbesserungsvorschläge zu den im vb@rchiv gelisteten Tipps und Workshops zu posten.
Hinweis: Ein neues Thema kann immer nur über die jeweilige Tipps & Tricks bzw. Workshop Seite eröffnet werden! | Fragen zu Tipps & Tricks und Workshops im vb@rchivTipp 1685: Daten vollständig + fehlerfrei über Winsock senden | | | Autor: ReBo | Tipp anzeigenDatum: 14.07.08 17:24 |
| Ich habe mal etwas herum experimentiert und bin auf folgende einfache Lösung gestoßen:
Public Sub Winsock1Senden(sData As String)
' Sendet die Länge des Datenpakets und die Daten
Winsock1.SendData Len(sData)
Winsock1.SendData sData
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim sData As String
Static Expected As Long
Do
If (Expected = 0) Then ' neuer Block
Winsock1.GetData Expected, vbLong ' Länge ermitteln
bytesTotal = bytesTotal - 4 ' den Long von der Menge abziehen
End If
Debug.Print "total/expected " & bytesTotal & " " & Expected
If (bytesTotal < Expected) Then Exit Sub ' auf mehr Daten warten
Winsock1.GetData sData, vbString, Expected ' benötigte Anzahl Daten us dem
' Buffer lesen
Expected = 0 ' Block Ende
CompleteData sData ' Block ausgeben
bytesTotal = Winsock1.BytesReceived ' restliche Daten ermitteln
Loop Until (bytesTotal = 0) ' wiederholen, bis alle Daten
' verarbeitet sind
End Sub
Private Sub CompleteData(ByVal sData As String)
' Hier werden die empfangenen Pakete weiterverarbeitet...
End Sub Meine Tests haben keine Fehler in der Übertragung gezeigt.
Ich wäre an Meinungen / Aufzeigen von Schwachstellen sehr interessiert. | |
Re: Daten vollständig + fehlerfrei über Winsock senden | | | Autor: Preisser | Datum: 15.07.08 13:54 |
| Hallo ReBo,
deine Lösung ist wirklich eine gute Idee. Dass man VB-Datentypen (wie Long) direkt, also binär, versenden kann und dass man eine bestimmte Länge der ankommenden Daten auslesen kann, wobei die restlichen Daten solange im Winsock internen Speicher bleiben, bis man sie ausliest, wusste ich gar nicht. Soweit ich das sehe, funktioniert der Code von dir einwandfrei, sogar, wenn der Long-Datentyp am Ende eines vorhergehenden Pakets in einer Übertragung beim Empfänger nicht vollständig ankommt (z. B. nur 2 Bytes von 4), denn dann ergibt das Auslesen des Longs 0, und die 2 Bytes bleiben im Winsockspeicher; bytesTotal wird dann negativ, wodurch die Sub beendet wird und auf mehr Daten wartet.
Wenn das Winsock-Control es schafft, auch größere Daten (z. B. 50 MB oder so) einwandfrei zu speichern, ist dieser Code wirklich effektiver als der Tipp von mir.
Eine Sache wäre dann aber noch: Falls man sich zu einer Anwendung verbindet, die nicht in der Art sendet, könnte dies dazu führen, dass die Expected-Variable ungewöhnliche Werte wie sehr große oder negative Zahlen annimmt. Dafür müsste man evtl. noch eine Fehlerbehandlung einbauen.
Ansonsten gute Arbeit.
MfG, Preißer | |
Re: Daten vollständig + fehlerfrei über Winsock senden | | | Autor: Preisser | Datum: 15.07.08 14:08 |
| Noch etwas:
Bei einer Verbindungstrennung und -wiederherstellung muss die Expected-Variable auf 0 gesetzt werden, denn wenn die Verbindung unterbrochen wird, während Daten empfangen wurden (also die Expected-Variable ungleich 0 war), und eine neue Verbindung hergestellt wird, würde der Code noch auf die alte Übertragung warten, sodass der Code dann nicht mehr korrekt arbeitet.
MfG, Preißer | |
Re: Daten vollständig + fehlerfrei über Winsock senden | | | Autor: ReBo | Datum: 15.07.08 15:21 |
| Na das freut mich aber, daß es tatsächlich so gut funktioniert. Ich bin da immer skeptisch, ob ich nicht doch ein Szenario übersehen habe.
Natürlich gehört da noch etwas "Errorhandling" dazu. Aus Gründen der Übersichtlichkeit habe ich das aber in der "Werkstatt-Version" mal weggelassen.
Beabsichtigt ist die Erstellung eines gekapselten Winsock Controls mit eben dieser Funktionalität und Weiteren..
Und danke für die Anmerkungen. | |
| Sie sind nicht angemeldet! Um einen neuen Beitrag schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
vb@rchiv CD Vol.6 vb@rchiv Vol.6
Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
Online-Update-Funktion Entwickler-Vollversionen u.v.m.Jetzt zugreifen Tipp 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
|
|
|
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
|
|