mikrocontroller.net

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


Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Najut, damit werd ichs mal probieren :-)

Dank dir!

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

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.