"netzwerkprotokoll" erstellen



  • hi leute,
    ich bin dabei ein Spiel "Schiffe Versenken" zu programmieren (c++), das über netzwerk funktioniert.

    Ich muss jetzt eine Art Protokoll programmieren, welches kenntlich macht, was für Daten gesendet wurden, beispielsweise müssen folgende Daten übertragen werden:

    Spiel wird initialisiert (Sende Spielername)
    Spielaufbau fertig (Sende Status Bereit)
    Chatmessage (Sende Message)
    Schuss (Sende Koordinaten an den Gegner)
    Beschossen (Erhalte Koordinaten) (Sende Antwort ob Treffer/Versenkt/Verfehlt)
    Aufgeben (Sende Status Aufgeben)
    usw.

    Nun muss kenntlich sein, was für Daten bei mir ankommen und vor allem wann neue Befehle angekommen sind.. mein Ausbilder meinte man könnte dafür z.B. "###Bereit" oder "###Message#Du bist echt gut!" (oder auch ein byte mit hex FF) als kennung neuer Befehle mit dessen Daten übergeben.. wie ist eurer meinung nach die beste Lösung? Die Sockets verwenden AF_INET.

    mfg



  • Im Großen und Ganzen musst du glaubich unterscheiden, ob du die Nachrichten in Textform verschickst (wie bei deinen Beispielen, "##Message#Hallo"), oder aber in Binärform (z.B. das erste Byte der Nachricht als "Was-Ist-Das-Für-Eine-Nachricht", das danachfolgende dem Kontext entsprechend). Die Textform lässt sich vermutlich einfacher implementieren, die Binärform verspricht etwas kleinere Nachrichten, was bei der geringen Datenmenge aber definitiv keine Rolle spielt.



  • Naja... entweder du hältst dich (zumindest grob) an irgendeinen bestehenden Standard (XML, ...), oder du erfindest selbst was.
    Wenn du selbst was erfindest würde ich auf jeden Fall was nehmen was einfach zu parsen ist aber trotzdem halbwegs einfach zu lesen...

    Könnte z.B. so aussehen:

    chat_message(text("Lalalubb"))
    
    do_fire(coordinates(x(3)y(5)))
    
    fire_result(status("hit"))
    

    ...oder auch so...

    begin
    command="chat_message"
    text="Lalalubb"
    end
    
    begin
    command="do_fire"
    coordinates.x=3
    coordinates.y=5
    end
    
    begin
    command="fire_result"
    status="hit"
    end
    

    ...oder so...

    ChatMessage: "Lalalubb"
    
    DoFire: 3, 5
    
    FireResult: hit
    

    ...oder auch ganz anders.

    Ich würde vielleicht die erste Version nehmen, da sowas extrem einfach zu parsen ist.
    Noch einfacher zu parsen ist natürlich ein Binärprotokoll, dafür tut man sich beim Debuggen schwerer. Viel schwerer.



  • hi,
    ein sehr einfaches binärprotokoll ist: http://en.wikipedia.org/wiki/Type-length-value
    verbküffend einfach und fast unendlich erweiterbar.
    🙂


Anmelden zum Antworten