CatchXML bei mehreren XML-Blöcken anwenden

Für allgemeine Fragen zur Programmierung mit PureBasic.
Sven
Beiträge: 374
Registriert: 23.09.2004 12:01

CatchXML bei mehreren XML-Blöcken anwenden

Beitrag von Sven »

Ich hab gerade eine Denkblockade, vielleicht hat jemand spontan eine Idee, wie ich das effizient lösen kann (kein Code, Denkanstoß reicht):

Ich schicke XML-Blöcke über ein Netzwerk (TCP):

Code: Alles auswählen

      ExportXML(xsend, *xmlbuff, xlen, #PB_XML_NoDeclaration)
     SendNetworkData(clID, *xmlbuff, xlen)
Ein Block sieht dann so aus: <text>...content...</text>

Und empfange diese mit:

Code: Alles auswählen

        tlen = ReceiveNetworkData(wdsvID, *lanbuff, 65535)
        xdat = CatchXML(#PB_Any, *lanbuff, tlen)
Funktioniert soweit. Schicke ich allerdings mehrere Blöcke kurz hintereinander, kann es vorkommen, daß die sich im Empfangsbuffer sammeln. Das sieht dann so aus: <text1>...content...</text1><text2>...content...</text2><text3>...content...</text3>

CatchXML liefert mir immer nur den ersten XML-Block im Buffer. Allerdings auch keine Info, wie lang der "gecatchte" Block ist, so daß ich nicht weiß, wo der nächste Block beginnen würde.

Wie komme ich an die nächsten Blöcke heran, ohne den Buffer "von Hand" parsen zu müssen?

Die Blöcke sind jeweils etwa 100 bis 1000 Bytes lang.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8820
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: CatchXML bei mehreren XML-Blöcken anwenden

Beitrag von NicTheQuick »

Du könntest entweder vor jedem 'SendNetworkData()' noch die Anzahl an Bytes als Long senden: SendNetworkData(clID, @xlen, SizeOf(Long)).
Oder du sendest nach jedem XML-Block noch ein Nullbyte. Dann kannst du jeden XML-Block bequem mit 'PeekS()' aus deinem Memorybuffer heraus lesen und die Stringlänge berechnen. Denn in einem XML-Block darf ja eh kein Nullbyte vorkommen.
Antworten