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

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!

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

Fragen zu Tipps & Tricks und Workshops im vb@rchiv
Tipp 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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Daten vollständig + fehlerfrei über Winsock senden 
Autor: SenZe
Datum: 19.07.08 15:08

Hey ReBo,
es wäre toll, wenn du deinen (fertigen) Code den anderen als Tipp zugänglich machen könntest

LG,Robert

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um einen neuen Beitrag 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