2017-02-05 2 views
1

ich bin mit einem Server in C# auf Chat-Anwendung arbeiten in C++ programmiert, kann ich bereits Nachrichten zwischen meinen Kunden senden und empfangen. Aber mein Problem ist jetzt, dass ein Mangel von mir wie die Struktur des TCP-Pakets definieren:C# TCP-Paketstruktur

[numberOfsequence: uint16_t] [id: uint16_t] [Daten: x] Wo:

  1. numberOfsequence: ist die Zahl meiner Paket (um sicherzustellen, dass in
    die Pakete empfangen, um, ich weiß, dass automatisch von TCP-Protokoll regled ist, aber ich will es auch tun)
  2. ID: représente die Art der
    Bedienung (Login, Nachricht, trennen) ID wird wie 0000 für Login, 0001 für Nachricht ....
  3. Daten: Informationen.

     //TO connect 
    
         TcpClient clientSocket; 
         NetworkStream serverStream; 
         clientSocket.Connect(IPAddress.Parse(textBoxIP.Text), Convert.ToInt32(textBoxPort.Text)); 
         serverStream = clientSocket.GetStream(); 
    
    
         //Sending login 
         byte[] outStream = System.Text.Encoding.ASCII.GetBytes(textBoxLogin.Text); 
         serverStream.Write(outStream, 0, outStream.Length); 
         serverStream.Flush(); 
    

So ist meine Frage, wie die Paketstruktur zu definieren? Dank

+0

Es schätzt, dass es nicht möglich sein kann, wenn Sie eine TCPClient, tcp und seine interne Struktur verwenden ist ein Standard und umgesetzt, soweit ich weiß, auf niedriger Niveau Hardware-Basis = Netzwerkkarte, es schnell zu machen. –

+0

Wenn Sie für die Paketintegrität verantwortlich sein wollen, müssen Sie ein anderes Protokoll wie udp verwenden. –

Antwort

1

Sie sollten die Länge des data Feld in der Paketstruktur umfassen. Dies liegt daran, dass TCP sich nicht mit Paketen, sondern mit Streams befasst. Das zugrunde liegende Protokoll kann Ihre Pakete zerlegen oder kombinieren, die Sie dann selbst behandeln und korrigieren müssen.

Wenn wir also die numberOfSequence und id Felder werden mit fester Länge, aber die Länge des data Feld annehmen kann variieren, das ist meine vorgeschlagene Paketstruktur:

numberOfSequence: 2 bytes 
id: 2 bytes 
dlength: 2 bytes 
data: dlength bytes 

Wie Sie sehen können, die dlength Feld gibt die Länge des Datenteils an. Das empfangende Ende sollte die dlength Information analysieren, bevor das data Feld gelesen wird. Wenn das empfangene "Paket" mehr Bytes enthält, als das Feld dlength anzeigt, sind die überlaufenden Bytes tatsächlich Teil des nächsten Pakets. Wenn der Wert dlength größer als die empfangenen Daten ist, müssen Sie warten, bis der Absender den Rest der Daten in den Stream schreibt.