[C++/QT] TCP/IP Server-Client-Verbindung

Mo1k

Mitglied
Hallo,

ich bin neu in der Netzwerkprogrammierung. Bis jetzt habe ich ein einfaches Beispiel programmiert ( Client Button drücken und der Server sendet einen Antwortstring ).

Nun frage ich mich wie ich folgene Aufgabe lösen soll:

Client und Server müssen verschidene Daten austauschen:
Zahlenwerte
Nachrichten

Wie weis der Client was der Server gerade sendet ?
Habe mir folgendes überlegt:
Das erste Byte in dem zu sedenden String ist das Identifikationsbyte das ich dann mit einer switchcase Anweisung auswerte, haltet ihr diese Vorgehensweise für sinnvoll ? Damit habe ich aber nur eine maximale Anzahl von 256 Verschiedenen Befehlen und wer weis wieviele ich in der Zukunft noch brauche.

Wie machen das die Profis ?

Mo1k
 
Hallo Mo1k

Grundsätzlich macht man das genau so wie du es beschrieben hast, man verwendet einen sogenannten Opcode (= Operation Code) um zu beschreiben was für Daten nun geschickt werden. Was du da nun genau verwendest ist eigentlich dir überlassen. Du kannst ja beispielsweise auch 2 Bytes nehmen als Opcode, dann hast du 65536 Möglichkeiten was ja schon mal ein guter Anfang ist. Wenn dir das dann doch zu wenig ist und du merkst, dass du langsam ans Ende kommst kannst du ja zum Beispiel den Opcode 65535 als "Opcode = 4 Bytes" definieren und dann die nächsten 2 Bytes als weiterer Opcode verwenden, dann hast du wieder 65535 neue Aktionen.

Eine andere Variante ist es zuerst einen 0-terminierten String voranzustellen, der die Aktion beschreibt. Der Vorteil ist hier, dass du natürlich unlimitiert bist in der Anzahl Aktionen, da ja die 0-Terminierung überall sein kann, der Nachteil ist, dass im Allgemeinen Vergleiche mit Strings halt langsamer sind als Vergleiche mit Zahlen.

Grüsse
Muepe
 
Hallo,
du kannst auch hergehen und dein eigenes Protokoll verwenden, oder ein bereits bestehendes verwenden (Z.B. das HTTP Protokoll). Dort sind dann auch viele Möglichkeiten um mehr Informationen, über Datenlänge, Datentyp etc. mitzusenden, sodass der Empfänger genau weiß, was er damit machen soll. Das erfordert meist nur einen relativ kurzen Header.

Deine Lösung mit den Bytes am Anfang ist im Prinzip genau dasselbe, nur halt etwas weniger portierbar und vielleicht nicht direkt ersichtlich, was ein einzelnes Zeichen bedeutet.

Grüße,
Jennesta
 
Zurück