Seite 1 von 1

CatchXML bei mehreren XML-Blöcken anwenden

Verfasst: 26.07.2015 14:29
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.

Re: CatchXML bei mehreren XML-Blöcken anwenden

Verfasst: 26.07.2015 14:41
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.