Hi,
ich bin gerade am überlegen wie ein Entwurfsmuster meiner Paket Klasse die für einen Game Server fungieren soll aussehen könnte.
PacketBuffer (Buffer für die empfangenen Pakete bzw. zum senden)
PacketFilter (Unbekannte Pakete etc. filtern)
PacketHandler (Pakete parsen und Callback Funktionen aufrufen z.B. wenn es sich um das Login Packet handelt)
PacketLog (Zum protokollieren der Pakete in eine .txt Datei)
PacketEncoding (Dient dazu um die Pakete zu verschlüsseln / entschlüsseln)
Mein Gedanke währe jetzt folgender:
Receive Packet:
Session -> PacketBuffer -> PacketEncoding -> PacketLog -> PacketFilter -> PacketHandler -> Klasse die das Packet handled
Send Packet:
Session -> PacketBuffer -> PacketEncoding -> PacketLog
Passt das so?
Außerdem muss ich noch irgendwo die Packete für den PacketHandler registrieren und den dazugehörigen Callback binden.
Bei dem Server habe ich das mehr oder weniger von den boost examples übernommen.
Klasse: Server
Startet die Servercore und beginnt neue Verbindungen anzunehmen.
Bei einer neuen Verbindung wird ein shared Objekt der Klasse 'Session' erstellt und in den Parametern das Socket übergeben sowie eine Referenz der Klasse SessionList.
Klasse: Session
Leitet von der Klasse Client sowie der Klasse std::enable_shared_from_this<T> ab.
Im Konstruktor wird der Socket und eine Referenz der SessionList erwartet, beide werden als Member gespeichert.
Außerdem wird die Session in die SessionList hinzugefügt und bei Verbindungsabbrüchen etc. wieder entfernt.
Klasse: Client
Enthält pure virtuelle Schnittstellen z.B. send.
Klasse: SessionList
Enthält virtuelle Funktionen für das sammeln von shared Client Objekten in einem Container und weitere virtuelle Funktionen.
Btw. In die Session Klasse würde ich alle Header wie Character, Account etc. packen und für alles eine Membervariable erstellen. Das Problem an der Sache ist aber, das die Session ja eig. nur einen indirekten Bezug zu dem Zeug wie z.B. Character hat und es somit bad practice ist, oder nicht?
Ansonsten schönes Wochenende euch noch. :)
ich bin gerade am überlegen wie ein Entwurfsmuster meiner Paket Klasse die für einen Game Server fungieren soll aussehen könnte.
PacketBuffer (Buffer für die empfangenen Pakete bzw. zum senden)
PacketFilter (Unbekannte Pakete etc. filtern)
PacketHandler (Pakete parsen und Callback Funktionen aufrufen z.B. wenn es sich um das Login Packet handelt)
PacketLog (Zum protokollieren der Pakete in eine .txt Datei)
PacketEncoding (Dient dazu um die Pakete zu verschlüsseln / entschlüsseln)
Mein Gedanke währe jetzt folgender:
Receive Packet:
Session -> PacketBuffer -> PacketEncoding -> PacketLog -> PacketFilter -> PacketHandler -> Klasse die das Packet handled
Send Packet:
Session -> PacketBuffer -> PacketEncoding -> PacketLog
Passt das so?
Außerdem muss ich noch irgendwo die Packete für den PacketHandler registrieren und den dazugehörigen Callback binden.
Bei dem Server habe ich das mehr oder weniger von den boost examples übernommen.
Klasse: Server
Startet die Servercore und beginnt neue Verbindungen anzunehmen.
Bei einer neuen Verbindung wird ein shared Objekt der Klasse 'Session' erstellt und in den Parametern das Socket übergeben sowie eine Referenz der Klasse SessionList.
Klasse: Session
Leitet von der Klasse Client sowie der Klasse std::enable_shared_from_this<T> ab.
Im Konstruktor wird der Socket und eine Referenz der SessionList erwartet, beide werden als Member gespeichert.
Außerdem wird die Session in die SessionList hinzugefügt und bei Verbindungsabbrüchen etc. wieder entfernt.
Klasse: Client
Enthält pure virtuelle Schnittstellen z.B. send.
Klasse: SessionList
Enthält virtuelle Funktionen für das sammeln von shared Client Objekten in einem Container und weitere virtuelle Funktionen.
Btw. In die Session Klasse würde ich alle Header wie Character, Account etc. packen und für alles eine Membervariable erstellen. Das Problem an der Sache ist aber, das die Session ja eig. nur einen indirekten Bezug zu dem Zeug wie z.B. Character hat und es somit bad practice ist, oder nicht?
Ansonsten schönes Wochenende euch noch. :)