Nochmal Socket-Probleme [Erledigt]

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Nochmal Socket-Probleme [Erledigt]

Beitrag von Jan »

Nachdem ich die Abfragen bei der Online-Datenbank prinzipiell wieder ans Laufen bekommen habe, kämpfe ich nun mit einem anderen Problem. Insbesondere bei längeren Rückantworten (ich sehe das reproduzierbar in einer mit 337 kB) werden wahlfrei Zeichen eingebaut, die da nicht rein gehören. Folgende habe ich bislang finden können:

CRLF
CRLF2000CRLF
13
141

Die werden wahlfrei irgendwo eingebaut, vorzugsweise mitten in einem String oder XML-Tag. In der oben beispielhaft genannten Rückantwort kommt das ca. 10x vor, bei jeder Übertragung der ansonsten gleichen Daten meist an unterschiedlichen Orten. Nur die 13 und die 141 kamen immer an der gleichen Position vor, fast am Ende mitten in einem schließenden XML-Tag. Und immer nur eines der beiden in diesem Tag, nie beide zusammen.

Alles mit CRLF-Kombinationen kann ich per StrTran() rausfiltern, weil die Zeilenschaltungen ansonsten generell nur LF sind. Aber einfach nur die 13 oder die 141?

Wie ich dort vorgehe:

Code: Alles auswählen

MEMVAR->gnSocket := SocketNew()
lSuccess := SocketConnect(MEMVAR->gnSocket, , cSubDomain + "DieDomain.org", nPort, @nError)
lSuccess := SocketNegotiateSSL(MEMVAR->gnSocket)

SocketSend(MEMVAR->gnSocket, cRequestHeader, , , @nError)

// Die Rückgabe auslesen
DO WHILE cBuffer <> Chr(0)
   cBuffer := SocketRecvStr(MEMVAR->gnSocket, 1 , @nError)
   cRueckgabeFamilySearch += cBuffer
ENDDO

// Den Socket wieder schließen
SocketShutdown(MEMVAR->gnSocket, SD_BOTH)
SocketClose(MEMVAR->gnSocket)
Das wars im Prinzip. Früher ist das auch imemr sauber gelaufen. Abgesehen davon - wie kommt es, das solche Zeichenketten da eingestreut werden können?

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Nochmal Socket-Probleme

Beitrag von AUGE_OHR »

keine Ahnung was dein Socket Problem angeht aber Xbase verwendet für "weiche" Zeilenumbrüche (Chr(141)+Chr(10))
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Nochmal Socket-Probleme

Beitrag von brandelh »

Ich meine MEMOEDIT (unter Clipper ?) nutzte nur chr(141), im Mle habe ich die nie gefunden.
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Nochmal Socket-Probleme

Beitrag von Jan »

Hallo Hubert, Jimmy,

ja klar bietet sich Chr(141) an, da war ich auch schon drüber gestolpert. Aber wir reden hier über einen String, den ich von einer Online-Datenbank per Sockets übertragen bekomme. Nicht von Memofeldern. Das sollte also wohl eher nicht der Fall sein hier.

Ich hab das Modul auch noch ein paar mal getestet. Manchmal "verheddert" der sich, manchmal läuft der sauber durch. keine Ahnung, was da im Hintergrund abläuft. Von daher wäre meine frage: Wenn ihr euch meinen Code anseht für die Socket-Kommunikation - ist das so sauber aufgebaut? Oder ist da was verquer? Fehlt da etwas dran?

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Nochmal Socket-Probleme

Beitrag von brandelh »

Ob es hilft weiß ich nicht, aber ich würde nError auswerten ...
und diese Zeile ...

DO WHILE cBuffer <> Chr(0)

funktioniert nur, wenn chr(0) als einzelnes Zeichen geschickt wurde.
Falls z.B. "Dies ist das Ende"+chr(0) angekommen ist, wird das Ende nicht erkannt.
Ich vermute, dass da ein Zeichenbuffer und keine Einzelzeichen ankommen ?

Falls chr(0) im Zeichenbuffer liegt, muss man linksbündig abschneiden.

Ich habe auch schon gehört, dass die Reihenfolge des Empfanges bei TCP/IP Paketen nicht garantiert ist,
ob das hier eine Rolle spielt kann ich nicht beurteilen.
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Nochmal Socket-Probleme

Beitrag von Jan »

Hallo Hubert,

doch, das Chr(0) sollte klappen. Da ich ja immer nur ein einzelnes Zeichen aus dem Stream abhole. Wären das mehr, dann hättest Du natürlich recht, dann müsste ich eher schauen auf ein "Chr(0) $ cBuffer".

das mit der Reihenfolge wäre natürlich übel. Kann aber auch eher nicht das Problem sein. Hier werden ja einfach Zeichen "eingestreut", die überhaupt nicht in die Zeichenkette rein gehören. Ein CR z. B. kommt in dem gesendeten String nirgends vor, immer nur ein LF. Wie also kommt das in meine empfangene Zeichenkette rein?

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Nochmal Socket-Probleme

Beitrag von brandelh »

jetzt hab ich das eine Zeichen auch gesehen ;-)

Wegen dem Timeout ?

Egal, eventuell cBuffer expliziet auf "" setzen, eventuell verheddert sich da was, obwohl es eigentlich nicht vorkommen dürfte.
Gruß
Hubert
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Re: Nochmal Socket-Probleme

Beitrag von andreas »

Bei TCPIP-Verbindung sollte die Reihenfolge der Pakete durch das Protokoll garantiert sein. Bei UDP ist es anders.
Ich würde in der Schleife auch noch Überprüfung auf unerwünschtes chr(0) einbauen, bevor es zu deinem String addiert wird, falls du dieses nicht brauchst.
Gruß,

Andreas
VIP der XUG Osnabrück
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Nochmal Socket-Probleme

Beitrag von Jan »

Hubert,

OK, das könnte ich mal versuchen, cBuffer nach dem Auslesen und Hinzufügen zur Gesamt-Zeichenkette explizit wieder auf "" zurück zu setzen. Einen Versuch ist das wert.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Nochmal Socket-Probleme

Beitrag von Jan »

Andreas,

was genau möchtest Du mir denn damit sagen? Ein unerwünschtes Chr(0) gibt es ja nicht. Das kommt ganz korrekt nur am Ende des Gesamt-Strings vor. Es kommen nur mitten drin merkwürdige andere Zeichen rein. Woher auch immer.

Da ich immer bis Chr(0) einlese und dann direkt aus der Schleife raus gehe, kann mitten in der Zeichenkette niemals eines vorkommen.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Nochmal Socket-Probleme

Beitrag von brandelh »

Er meinte, dass du es als LETZTES Zeichen anhängst und war sich nicht sicher, dass das so erwünscht ist.
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Nochmal Socket-Probleme

Beitrag von Jan »

Hallo Hubert,

achso. OK, das hatte ich jetzt so überhaupt nicht verstanden. Ist aber auch nicht das eigentliche Problem. Das ließe sich ja noch locker beheben. Gut, das eigentliche Problem auch, wenn ich denn wüßte, woran das liegen könnte.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1418
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Re: Nochmal Socket-Probleme

Beitrag von Rudolf »

Hallo Jan,
um Probleme auszuschließen würde ich mal mit Chilkat testen, das funktioniert perfekt, wenn damit auch Mist reinkommt, liegt es am Sender. Und Du hast ein "Standard Tool" welches Dein Kunde ja fordert. Ich verwende es auch aus diesem Grund da ich komplexe Kommunikationsschnittstellen mit Behörden mache und im Zweifelsfall damit nachweisen kann dass mein Code richtig ist (meistens jedenfalls ;-). Der Vorteil ist dass es Chilkat für fast jede Programmiersprache gibt, damit kann der Kunde dann das Problem auch selbst analysieren und ev. nachvollziehen oder auch Fehler finden.
Grüße
Rudolf
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Nochmal Socket-Probleme

Beitrag von brandelh »

Um sicher zu sein, dass es nicht an Xbase++ (Socket Klasse) liegt, müsste man entweder den Netzverkehr aufzeichnen,
oder mit einer anderen Sprache viele Abfragen starten und die Ergebnisse sichten.

Falls die eine Beispielanwendung z.B. für C# haben, die express Version ist ja kostenlos und testen.
Übel, aber der einzige Weg. Wenn dann da nix falsches kommt, könnte es an dem GC liegen.
Eigentlich konnte ich mich auf die Stringbehandlung ja immer verlassen, aber seit dem Bug mit dem XbpFileDialog() center := .t. bin ich mir da nicht mehr so sicher.

PS: Rudolf war schneller, ich wollte meine Antwort aber nicht löschen ;-)
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Nochmal Socket-Probleme

Beitrag von Jan »

Hallo Rudolf und Hubert,

wenn das mit dem Tipp von Hubert, cBuffer zurück zu setzen, nicht nützt, versuch ich mal, den Verkehr aufzuzeichnen. Wobei ich befürchte, daß das nicht das Problem ist. Denn dann würden ja auch andere Entwickler, die an der Onlinedatenbank arbeiten, da Fehler mit haben. Ich bin mir deswegen sehr sehr sicher, daß ich ein internes Problem habe. Warum und weswegen auch immer.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Nochmal Socket-Probleme

Beitrag von brandelh »

Das ist doch eine HTTP Schnittstelle, kann man da nicht das GET.EXE benutzen, das Georg verwendet ?
Ein solches Tools wäre für Tests am einfachsten, da z.b. per Batchdatei zu steuern.
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Nochmal Socket-Probleme

Beitrag von brandelh »

Denn dann würden ja auch andere Entwickler, die an der Onlinedatenbank arbeiten, da Fehler mit haben. Ich bin mir deswegen sehr sehr sicher, daß ich ein internes Problem habe.
Wenn es möglich ist, den HTTP / PRG Code zu isolieren, der genau diese Abfrage macht, und du den dann an einige von uns geben könntest, könnte man testen.

An dem oben gezeigten Beispiel (Anmeldung, kleine Schleife auslesen, schließen ...) kann es kaum liegen ...

Außer, du nutzt eventuell mehrere Abfragen in verschiedenen Threads gleichzeitig und die vertragen es nicht (ich erinnere mich da an eine Memory Variable).
Gruß
Hubert
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: Nochmal Socket-Probleme

Beitrag von ramses »

Hallo Jan

seit wann bezw. xbase Version hast du diese Erscheinung?

ist dir schon aufgefallen dass deine App Speicher frisst?

Gruss Carlo
Valar Morghulis

Gruss Carlo
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Nochmal Socket-Probleme

Beitrag von Jan »

Hallo Carlo,

öhm, ? Keine Ahnung, seit wann das passiert. Ich würde mal auf irgendwas um Build 800 schätzen. Und den Speicherverbrauch habe ich noch nicht kontrolliert.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Nochmal Socket-Probleme

Beitrag von Jan »

Hallo Hubert,

gestern habe ich mal deinen Tipp getestet. Das lief ganz merkwürdig. Ich hab ja die Schleife mit zwei Codezeilen, wo ich ein Zeichen auslese, und das dann an die Gesamt-Zeichenkette anhänge. Ich habe da als dritte Zeile ein cBuffer := "" eingebaut. Von da an lief das gar nicht mehr! Der kam da einfach nicht mehr weiter, cBuffer war nur noch leer.

Irritation ...

Ich habe jetzt einfach eine Schleife dahinter gehängt, die nachschaut, ob es ein CR gibt, an welcher Position das steht, an welcher Position das nächste steht, und alles dazwischen inkl. der CRLF am Anfang und Ende weglöscht. Damit klappt das jetzt einwandfrei. Ziemlich krude, aber anscheinend erstmal der einzige Weg, das hinzubekommen.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: Nochmal Socket-Probleme

Beitrag von ramses »

Hallo Jan

800 scheint irgendwie zu passen .... zu meinen Sorgen ....

versuch doch mal die xbSocket Klasse ich habe ein Kommunikations-Programm das damit fehlerlos und problemlos läuft.

Gruss Carlo
Valar Morghulis

Gruss Carlo
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Nochmal Socket-Probleme

Beitrag von Martin Altmann »

Jan,
womit hast Du cBuffer eigentlich initialisiert??
Versuche doch mal folgendes Konstrukt:

Code: Alles auswählen

DO WHILE ( cBuffer := SocketRecvStr(MEMVAR->gnSocket, 1 , @nError) ) <> Chr(0)
   cRueckgabeFamilySearch += cBuffer
ENDDO
Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Nochmal Socket-Probleme

Beitrag von Jan »

Hallo Carlo,

xbSocket?

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Nochmal Socket-Probleme

Beitrag von Jan »

Hallo Martin,

Code: Alles auswählen

LOCAL cBuffer := ""
Deinen Code kann ich heute Abend mal testen.

Achso: MEMVAR->gnSocket habe ich ebenfalls auf LOCAL umgeschrieben. Das mit der PUBLIC war noch irgend ein Relikt aus vergangenen Tagen, wo ich den Socket auch an anderer Stelle brauchte.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Nochmal Socket-Probleme

Beitrag von Martin Altmann »

Jan,
das heißt, Du hast die cBuffer genau so initialisiert, wie Hubert dich bat, sie zu leeren? Und trotzdem ist er in die Schliefe reingegangen (bzw. wieder aus ihr rausgekommen)??
Wenn Du den gelesenen Wert auf "" (leer) änderst, dann sollte er nie chr(0) sein - oder er ist es bereits vorher, da Du ihn ja vor dem Betreten der While mit "" (leer) initialisiert hast!
Lange Rede kurzer Sinn: Verfälsche den Wert von cBuffer auf keinen Fall, wenn Du ihn als Kriterium für den Schleifendurchlauf nimmst - dann mach es eher so, wie ich vorgeschlagen habe.

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Antworten