2017-02-22 4 views
1

Ich bin neu im TCP/IP-Protokoll und möchte einen Server für einen Chat in C++ erstellen.Unterstützt TCP nicht druckbare Zeichen?

Vorerst habe ich beschlossen, alle meine Übertragungen mit einem Zeichen zu beginnen, um zu sagen, was als nächstes kommt (eine Anmeldeanforderung, eine Nachricht zum Posten, der Benutzername eines Clients, ...).

Also verwende ich Werte wie 0x01, 0x02, ... für was mit Login, Informationsanforderung, ... und 0x10 für die Nachrichten verwandt ist.

Hoffentlich, wenn ich versuche, mit einem anderen Programm, das ich erstellt habe, eine Verbindung mit meinem Server zu verbinden, bekomme ich eine Übertragung vom Server, die mit 0x01 beginnt (also alles noch in Ordnung ist), aber dann wenn ich mit etwas von 0x03 antworten , der Server empfängt es nur, wenn ich den Klienten töte ...

Ich denke, dass es die Auswahlfunktion ist, die nicht sagt, dass es etwas zu lesen gibt.

Ist das normal?

Und wenn ja, sollte ich diese Werte durch Werte ersetzen, die druckbar sind und keine besondere Bedeutung haben?

+2

TCP arbeitet mit Bytes, also Werte 0-255 unabhängig davon, ob sie von nicht druckbaren Zeichen druckbar sind. Wählen Sie einen völlig anderen Ansatz. Setzen Sie alle in eine Nachricht mit Header. –

+0

Ja, TCP ist ziemlich glücklich mit binären Daten. Teilen Sie die relevanten Abschnitte sowohl von Ihrem Client und Server/ –

+0

@ ErikŠťastný Aber funktioniert auch Auswahl mit 0-255 Werte? – dido22

Antwort

4

TCP ist vollständig ein binäres Protokoll. Es definiert einen Paket-Header, der dem IP-Datagramm-Header folgt. Ein kontinuierlicher Datenstrom wird in Pakete unterteilt, so dass er (hoffentlich) glatt von Punkt A zu Punkt B verläuft. Der Strom umfasst willkürliche Oktette (Bytes).

Sind Sie sicher, dass der einzige Unterschied zwischen den Nachrichten der Anfangsbytewert $01 vs $03 ist? Vielleicht ist die Nachrichtengröße anders? Vielleicht macht eine Instanz etwas, um den Stream zu spülen? Vielleicht werden die Nachrichten nacheinander in einer Sitzung gesendet?

Wenn Sie kurze, diskrete Nachrichten schnell übertragen müssen, kann UDP dazu beitragen, überraschende Latenzen zu verhindern.

+3

Aber UDP kann helfen, unerwarteten Paketverlust zu verursachen ... – osgx

+0

@osgx UDP hat keinen Mechanismus der Rückübertragung, aber Sie können Ihr eigenes hinzufügen. TCP hat keinen zuverlässigen Spülmechanismus und Workarounds neigen dazu, zu saugen. Wähle dein Gift. – Potatoswatter

Verwandte Themen