Die Community zu .NET und Classic VB.
Menü

FAQ 0018: Wie verhindere ich, daß Winsock zwei Datensätze zu einem zusammensetzt?

 von 

Frage 

Ich sende mit Winsock nacheinander zwei Datensätze (Texte, Zahlen, Bilder). Beim Empfänger sind die beiden Datensätze aber zu einer zusammengefaßt. Wie verhindere ich das?

Antwort  

Winsock arbeitet ereignisorientiert, d.h. die zu sendenden Daten landen erst in einem Puffer, den Winsock verwaltet. Sobald Windows eine Nachricht verschickt, daß die Controls ihre Arbeiten zu erledigen haben, kann auch Winsock den Inhalt des Puffers versenden.
Man kann Windows sagen, daß es jetzt Zeit bekommt, die Controls zu aktualisieren. Dazu muß man DoEvents aufrufen.

Winsock1.SendData "Erster Datensatz"
DoEvents
Winsock1.SendData "Zweiter Datensatz"

Listing 1: Daten mit DoEvents trennen

DoEvents ist aber nicht das Wahre, da die eigene Anwendung unter Umständen lange warten muß, bis es die Kontrolle zurück erhält.
Deshalb ist es besser, die zu versendenden Daten "einzupacken": Man definiere einen Delimiter, der garantiert nicht in den Daten vorkommt:

Private Const strIPDelimiter As String = "[IP]"
Private Const strNickDelimiter As String = "[Nick]"
Private Const strPackageDelimiter As String = "{[NewPackage]}"

Winsock1.SendData strIPDelimiter & "192.168.1.1" & _
                  strPackageDelimter
Winsock1.SendData strNickDelimiter & "Daniel Düsentrieb" & _
                  strPackageDelimiter

Listing 2: Eigene Datensatztrenner

Die empfangenen Daten kann man so prima splitten:

Dim strPackages() As String
Dim strPackage As String
Dim lngPackage As Long

Winsock1.GetData strPackage
strPackages = Split(strPackage, strPackageDelimiter)
For lngPackage = LBound(strPackages) To UBound(strPackages)
    strPackage = strPackages(lngPackage)
    Debug.Print strPackage
Next lngPackage

Listing 3: Eigener Datensatztrenner

Die einzelnen Pakete werden getrennt voneinander verarbeitet und man muß sich keinen Kopf mehr über das gemeinsame Versenden der Daten machen.

Ihre Meinung  

Falls Sie Fragen zu dieser FAQ haben, Ihre Erfahrung mit anderen Nutzern austauschen möchten oder auf eine Ergänzung hinweisen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.