Huhu, Ich bräuchte mal so den einen oder anderen Ratschlag. Zurzeit entwickle ich (aus Langeweile ;)) eine Art Chat. Die Schnittstelle ist eine Winsock2 Kapselung via einer Klasse. Soweit so gut. Jetzt benötige ich natürlich ein Protokoll, zwischen Server/Client. Bisher mache ich das so, dass ein Paket immer zB 2kB Größe hat. Je nach dem ersten Byte dieses Paketes (Command-Byte) überlegt sich dann der Empfänger, was der Sender mit dem Rest des Paketes (Dem Parameter, quasi) gemeint haben könnte. Dafür bette ich quasi eine Struktur in dieses Paket ein. (Verschiedene Kommandotypen haben ihre eigene Struktur, die den Parameter beschreibt). In der nächste Version wollte ich das dann so machen: Es wird das Command-Byte gelesen und anschließend die Länge des Parameters. Anschließend wird der komplette Parameter empfangen (Quasi eine Schleife, bis alle Bytes angekommen sind). Jetzt ergibt sich aber folgendes Problem: Will mir jetzt jemand einen Streich spielen, und schickt ein Paket mit Parameterlänge 5, schickt mir aber 10 Parameterbytes, so Gerät alles aus dem Takt. Jetzt meine Frage: Gibts irgendeine Art "Richtlinie" oder auch nur Tipps, wie ich mir ein eigenes Protokoll entwickle? Ich denke da an Start/Stop Bytes, die aber nicht im Parameter vorkommen dürfen. Wenn da also jemand Ratschläge zu hat, wäre ich demjenigen sehr verbunden.
Du könntest eine Headerstruktur an den Anfang eines jeden Paketes setzen, in der nicht nur das Kommandobyte, sondern auch noch die Anzahl der zugehörigen Nutzbytes und eine Prüfsumme über alles drinsteht. Wenn Du dann nur noch Pakete auswertest, bei denen die Prüfsumme stimmt, dann liegst Du auf einer etwas abgesicherteren Seite. Zusätzlich könntest Du noch ein "magic word", also eine bestimmte Zahlenkonstante in Deine Paketheader eintragen, um diese schneller erkennen zu können. Das sollte dann schon ein DWORD (uint32_t) sein, Werte wie 0xfeedc0de oder 0xdeadface lassen sich auch in einem Hexdump schön erkennen. Erfolg!
Najut, damit werd ichs mal probieren :-) Dank dir! PS: 0xdeadface als Start-Erkennung zu nutzen hat irgendwie was im Packet-Analzyer *g
Wenn du nicht hauptsächlich Binärdaten übertragen willst, dann würde ich auf jeden Fall ein ASCII-basiertes Protokoll bauen, z.B. angelehnt an HTTP. Das ist übersichtlicher und entsprechend leichter zu implementieren und zu debuggen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.