Checksumme von string bilden???

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
laz847
Beiträge: 114
Registriert: Mi 18. Jun 2014, 16:39

Checksumme von string bilden???

Beitrag von laz847 »

Ganz kurze Frage, wie man eine Checksumme von einem String bildet weiß ich, wie man verschiedene Verfahren dazu bei Google findet auch. Ich möchte aber mit meiner Frage noch etwas tiefer in die Materie, welche Algos sind für Hochgeschwindigkeitsanwendungen am effektivsten, gerade bei Strings ist das ja bei High-Speed zu merken, da kann der falsche Einsatz merkliche Unterschiede machen.

crc() ???

Code: Alles auswählen

var tmp_msg:PWideChar;  
tmp_msg : =Ansistring(_msg);
FClient.SendMessage(tmp_msg+' -> crc '+crc(tmp_msg));  
Zur Erklärung, es soll ein String vom TCP-Client zum Server gesendet werden, der Client versieht den String mit der Checksum, der Server kann so feststellen ob die Nachricht valide ist und sendet 'ok' zurück, der Client kann den nächsten Satz senden. Die Checksumme sollte auch möglichst kurz sein?

Vorschläge? Vielen Dank !!!
Zuletzt geändert von laz847 am Fr 20. Jun 2014, 21:04, insgesamt 1-mal geändert.

Benutzeravatar
theo
Beiträge: 10867
Registriert: Mo 11. Sep 2006, 19:01

Re: Checksumme von string bilden???

Beitrag von theo »

Warum siehst du eine Notwendigkeit, das zu prüfen? TCP ist da schon ziemlich zuverlässig.

laz847
Beiträge: 114
Registriert: Mi 18. Jun 2014, 16:39

Re: Checksumme von string bilden???

Beitrag von laz847 »

Die Frage ist nicht unberechtigt, ich kenn mich in dem Bereich nicht so aus und wollte auf Nummer sicher gehen, dass am Server nicht mal etwas fehlt. Ich brauche das auch nicht zwingend für die Übertragung von kleinen einzelnen Strings, mir gehts es vielmehr um das hier. Der Client soll 2 Sachen tun, 1 kurze Infos senden, normale Strings, da brauch ich auch keinen crc oder so etwas, der Server muss hier nichts prüfen.

Weiterhin stehe ich aber vor der Herausforderung, dass ich mit der Verbindung auch grössere Mengen an Daten (z.B. Array) übertragen muss und keine Ahnung habe wie am Besten :D .

Das hält mich aber nicht ab es zu zu versuchen :P

Meine Idee:

Quelle ist ein Array

double array[100000][5];

Das soll der Client zum Server übertragen, ich dachte mir ich mache daraus im Client einen Packed Record und sende den in Chunks zum Server, dort prüfe der den Crc und setze den Packed Record wieder zusammen. Das ist vermutlich sinnvoller als jeden Wert einzeln zu senden oder ?

Benutzeravatar
theo
Beiträge: 10867
Registriert: Mo 11. Sep 2006, 19:01

Re: Checksumme von string bilden???

Beitrag von theo »

Naja, das hängt wohl von der verwendeten Library ab, wie man das macht.

Bei Synapse kannst du z.B. einfach einen Stream senden mit:
procedure SendStream(const Stream: TStream); virtual;

http://synapse.ararat.cz/doc/help/

laz847
Beiträge: 114
Registriert: Mi 18. Jun 2014, 16:39

Re: Checksumme von string bilden???

Beitrag von laz847 »

Danke aber das wundert mich, hatte Synapse beim Suchen gefunden und mir das angeschaut aber gedacht das was ich brauche ist dort nicht dabei, ich gucke wohl falsch??

http://synapse.ararat.cz/doc/help/AllUnits.html

http://synapse.ararat.cz/doc/help/laz_synapse.html

http://synapse.ararat.cz/doc/help/AllFunctions.html

SendToRaw dachte ich aber da steht nur überall etwas mit Http & Mail usw...

Jedenfalls habe ich mich weil ich dort eben nichts gefunden habe für LNet entschieden.

Soweit ich es aber bisher mitbekommen habe und hier im Forum gelesen habe macht das niemand und checkt die eingehenden Pakete, kann ich also anscheinende weglassen?

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Checksumme von string bilden???

Beitrag von Christian »

Dafür gibts TCP TCP setzt auf IP auf, IP sendet alles ungeprüft TCP sorgt dafür das die Pakete in richtiger Reihenfolge und vollständig ankommen. Du brauchst das bei TCP/IP also nicht mehr selbst prüfen. Bei IP müsstest du das.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Checksumme von string bilden???

Beitrag von mschnell »

Schon das TP-Prodokoll (und noch darunter das Ethernet-Protokoll oder andere verwendete low-Level-Protokolle) machen die Fehler-Prüfung. Pakete mit Bit-Fehlern werden nicht weitergegeben, sondern ersatzlos verworfen.

Das TCP - Protokoll handelt alle Prüfungen und macht automatische Wiederholungen, wenn Fehler auftreten. Lässt sich ein Fehler durch Wiederholungen nicht korrigieren, wird die komplette TCP - Verbindung mit Fehlermeldung abgebrochen. Ein "Wiederaufsetzen" auf User-Ebene ist weder sinnvoll noch vorgesehen.

Das UDP-Protokoll (das auch IP verwendet) macht keine Wiederholung. Hier muss der User dafür sorgen, dass fehlerhafte (und damit ausfallende) Pakete wiederholt werden, falls das nötig ist.

Natürlich ist es theoretisch möglich, dass Mehfach-Bitfehler zu verfälschten Daten führen, die die Fehler-Erkennung passieren. Das ist aber höchst unwahrscheinlich und in der Praxis vermutlich nicht relevant. Man kann durch eine zusätzliche Prüfung die Wahrscheinlichkeit vermindern, aber absolute Sicherheit gibt es sowieso nicht.

-Michael

laz847
Beiträge: 114
Registriert: Mi 18. Jun 2014, 16:39

Re: Checksumme von string bilden???

Beitrag von laz847 »

Cool das klingt gut, da war ich wohl etwas übervorsichtig. Das heisst im Falle eines Fehlers brauch ich da gar nicht rumdoktern, am besten Verbindung neu aufbauen und erneut senden.

Vielen Dank :!: :?

Benutzeravatar
theo
Beiträge: 10867
Registriert: Mo 11. Sep 2006, 19:01

Re: Checksumme von string bilden???

Beitrag von theo »

Die grundlegende Klasse bei Synapse für deinen Fall ist
http://synapse.ararat.cz/doc/help/blcks ... ocket.html
Die erbt nat. u.A. alle Methoden von
http://synapse.ararat.cz/doc/help/blcks ... ocket.html

laz847
Beiträge: 114
Registriert: Mi 18. Jun 2014, 16:39

Re: Checksumme von string bilden???

Beitrag von laz847 »

Vielen Dank aber ich denke ich bleibe bei LNet, dass ich nicht weiß wie liegt ja eher an mir als an LNet / Synapse :D

Benutzeravatar
theo
Beiträge: 10867
Registriert: Mo 11. Sep 2006, 19:01

Re: Checksumme von string bilden???

Beitrag von theo »

laz847 hat geschrieben:Vielen Dank aber ich denke ich bleibe bei LNet, dass ich nicht weiß wie liegt ja eher an mir als an LNet / Synapse :D
Musst du selber wissen. Ich arbeite lieber mit Synapse, weil ich hierbei keinen Wert auf visuelle Komponenten lege.
Da brauchst du keine Eventhandler, sondern reihst einfach Befehle aneinander.
z.B. Sock.SendStream(MyStream) reicht. Wenn die Fkt. zurückkehrt, sind die Daten raus.
Allenfalls liegt ein Fehler in Sock.LastError.

Antworten