protokoll implementieren



  • hallo

    ich möchte verschiedene messdaten mittels tcp über das netzwerk an einen anderen pc übertragen. ein protokoll zur identifizierung der daten habe ich schon entwickelt:

    aufbau eines paketes:
    #| 1 Byte header | 1-2 Byte Daten |#

    beispiel: messdaten von kanal 1
    --------------------------------------------
    kennung von kanal 1: 0x1
    daten von kanal 1: 1001101001100110

    resultierendes paket: #|00000001|1001101001100110|#

    ich habe mich mit TServerSocket und TClientSocket schon beschäftigt und eine Funktion zum Senden geschrieben:

    void TMainForm::SendData (unsigned char Header, unsigned char Data[2])
    {
     void *pData;
     unsigned char Sendbuffer[3];
    
     pData=&Sendbuffer;
    
     Sendbuffer[0] = Header;
     Sendbuffer[1] = Data[0];
     Sendbuffer[2] = Data[1];
    
     try
     {
            ClientSocket->Socket->SendBuf(pData, 3);
     }
     catch (...) {};
    }
    

    fallen euch verbesserungvorschläge ein? außerdem weiß ich noch nicht genau wie ich die funktion zum empfangen aufbauen soll. mein ziel ist eine funktion zum senden, der ich header und daten getrennt übergebe, und eine funktion zum empfangen von der ich header und daten getrennt erhalte.

    lg
    achim



  • die länge der zu erwartenden daten kann ich aus dem header bestimmen.

    ist es sinnvoll wenn ich mit char variablen arbeite oder gibt es eine bessere methode daten binär zu bearbeiten und zu übertragen?
    hat jemand eine idee?

    achim



  • Ich würde mir folgende Dinge überlegen:
    1. Kann es sein, dass Zeichen ausserhalb der gültigen Charakter (also z.B. 0) auftreten in den Messwerten?
    2. Generell ist es sinnvoll, binäre Daten mit binären Funktionen zu verarbeiten. (memcpy, memcmp, memset, etc)
    3. Versuch doch in einem nächsten Schritt den NEtzwerk-Code (Versand) und den Protokoll Codec zu trennen. Ich denke, das hattest du auch vor, und ist durchaus good practice...

    Gestalte den Netzwerk-Code so, dass der Code lediglich einen Puffer mit den empfangenen Daten füttert. Den Codec würde ich vielleicht in einen eigenen Thread auslagern. Das hilft dann bei der Protokollberarbeitung im Hintergrund (achtung: Synchrionisation notwendig! Critical Sections sind hier klar dein Freund, ebenso wie ZUgriffsroutinen auf den gemeinsamen PUffer!) Der Thread kann sich dann schlafen legen, bis der NEtzwerk-Code Bytes empfangen hat. Sobald dies geschehen ist, kickt der NEtzwerk-Code wieder den Codec an. Der Codec erwacht, schaut ob das Framing stimmt, und ob es komplett ist. Wenn nicht, dann legt er sich wieder schlafen und wartet auf die nächste Ankunft, etc... Mach dir darum mal einige Gedanken.



  • wenn ich das richtig verstanden habe läuft im hintergrund ein ringbuffer in den die empfangenen daten geschrieben werden. die funktion zum dekodieren des protokolls läuft als thread und zwar solange sich daten im buffer befinden. bei der verwendung eines ringbuffers fällt dann das problem der synchronisation weg.

    das mit den ungültigen charakter habe ich nicht verstanden. prinzipiell ist es möglich, dass ein messwert null ist. kann ich dann nicht auch null empfangen?

    achim



  • Hast du richtig verstanden. Das mit den ungültigen Buchstaben hat mit diesem Punkt zu tun:

    junix schrieb:

    2. Generell ist es sinnvoll, binäre Daten mit binären Funktionen zu verarbeiten. (memcpy, memcmp, memset, etc)


Anmelden zum Antworten