Forum: PC-Programmierung Protokollentwicklung für eigene Client/Server Applikation


von Simon K. (simon) Benutzerseite


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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!

von Simon K. (simon) Benutzerseite


Lesenswert?

Najut, damit werd ichs mal probieren :-)

Dank dir!

PS: 0xdeadface als Start-Erkennung zu nutzen hat irgendwie was im 
Packet-Analzyer *g

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.