Skip to content

Latest commit

 

History

History
185 lines (150 loc) · 5.17 KB

README.md

File metadata and controls

185 lines (150 loc) · 5.17 KB

TCP State Pattern Implementierung

Überblick

Diese Implementierung demonstriert das State Pattern anhand einer TCP-Verbindungssimulation. Das Projekt zeigt, wie man zustandsabhängiges Verhalten effektiv organisieren und verwalten kann.

Features

  • Simulation der wichtigsten TCP-Verbindungszustände
  • Interaktives Menü zur Steuerung der Verbindung
  • Farbige Konsolenausgabe für bessere Übersicht
  • Statistik-Tracking für Verbindungsaktivitäten
  • Implementierung des State Patterns
  • Fehlerbehandlung für ungültige Zustandsübergänge

Installation

  1. Klone das Repository:
git clone https://github.com/goljunge91/tcp-state-pattern.git
  1. Wechsle in das Projektverzeichnis:
cd tcp-state-pattern
  1. Kompiliere das Projekt:
mkdir build
cd build
cmake ..
make

Verwendung

Starte das Programm:

./tcp_state_machine

Verfügbare Befehle:

  • ACTIVEOPEN: Aktiver Verbindungsaufbau
  • PASSIVEOPEN: Passiver Verbindungsaufbau
  • SEND: Daten senden
  • CLOSE: Verbindung schließen
  • ACK: Bestätigung senden
  • SYNC: Synchronisation durchführen
  • OCTET: Text-Daten senden
  • SHOWSTATE: Aktuellen Zustand anzeigen
  • SHOWSTATS: Statistiken anzeigen
  • MENU: Menü anzeigen
  • EXIT: Programm beenden

Projektstruktur

Hauptkomponenten

  • TCPConnection: Hauptklasse für die Verbindungsverwaltung
  • TCPState: Abstrakte Basisklasse für alle Zustände
  • TCPClosed: Implementierung des geschlossenen Zustands
  • TCPListen: Implementierung des Listen-Zustands
  • TCPEstablished: Implementierung des etablierten Zustands

Dateien

src/
├── TCPConnection.h/cpp     # Hauptklasse
├── TCPState.h/cpp         # Abstrakte Zustandsklasse
├── states/               # Konkrete Zustandsimplementierungen
│   ├── TCPClosed.h/cpp
│   ├── TCPListen.h/cpp
│   └── TCPEstablished.h/cpp
├── TCPOctetStream.h/cpp   # Datenstream-Implementierung
└── Menu.h/cpp            # Menü-System

Design

Das Projekt verwendet das State Pattern mit folgenden Komponenten:

  1. Context (TCPConnection)

    • Verwaltet den aktuellen Zustand
    • Delegiert zustandsspezifische Anfragen
  2. State (TCPState)

    • Definiert die Schnittstelle für zustandsspezifisches Verhalten
    • Implementiert Standardverhalten
  3. Concrete States

    • TCPClosed: Initialzustand
    • TCPListen: Wartet auf Verbindungen
    • TCPEstablished: Aktive Verbindung

Erweiterungen

Das System kann einfach um weitere Zustände erweitert werden:

  1. Erstelle neue Zustandsklasse
  2. Erbe von TCPState
  3. Implementiere erforderliche Methoden
  4. Füge Zustandsübergänge hinzu

Beispiel für einen neuen Zustand

#ifndef TCPWAITING_H
#define TCPWAITING_H

#include "../TCPState.h"

class TCPWaiting : public TCPState {
public:
// Überschreiben der relevanten Methoden
void Acknowledge(TCPConnection* connection) override;
void Close(TCPConnection* connection) override;
void Send(TCPConnection* connection) override;

    // Name des Zustands
    string GetName() const override {
        return "WAITING";
    }
};

#endif
#include "TCPWaiting.h"
#include "../TCPConnection.h"
#include "TCPEstablished.h"
#include "TCPClosed.h"
#include <iostream>

void TCPWaiting::Acknowledge(TCPConnection* connection) {
    std::cout << "\033[32mAcknowledge empfangen, wechsle zu ESTABLISHED\033[0m\n";
    ChangeState(connection, new TCPEstablished());
}

void TCPWaiting::Close(TCPConnection* connection) {
    std::cout << "\033[31mVerbindung wird geschlossen\033[0m\n";
    ChangeState(connection, new TCPClosed());
}

void TCPWaiting::Send(TCPConnection* connection) {
    std::cout << "\033[33mSenden im WAITING-Zustand nicht möglich\033[0m\n";
        ChangeState(connection, new TCPClosed());

}
// ## TCPEstablished
void TCPEstablished::Send(TCPConnection* connection) {
    if(sendBuffer_.size() >= windowSize_) {
        std::cout << "\033[33m[Warning] Sendefenster voll. Warte auf ACKs...\033[0m\n";
        ChangeState(connection, new TCPWaiting());  // Wechsel zu WAITING wenn Buffer voll
        return;
    }

    connection->IncrementPacketCount();  // Erhöhe Paketzähler
    
    std::cout << "\033[32m[Send] Bereit für neue Datenübertragung\033[0m\n"
              << "Aktuelles Fenster: " << sendBuffer_.size() << "/" << windowSize_ << "\n";
              
    // Optional: Wechsel zu WAITING nach erfolgreichem Senden
    if(sendBuffer_.size() > windowSize_ / 2) {  // Beispiel: Wechsel wenn Buffer mehr als halb voll
        std::cout << "\033[33m[Info] Buffer wird voll, wechsle zu WAITING...\033[0m\n";
        ChangeState(connection, new TCPWaiting());
    }
}

Fehlerbehebung

  • Problem: Ungültiger Zustandsübergang

    • Lösung: Prüfen Sie den aktuellen Zustand mit SHOWSTATE
  • Problem: Verbindung reagiert nicht

    • Lösung: Verwenden Sie SHOWSTATS zur Diagnose

Mitwirken

  1. Fork das Projekt
  2. Erstelle einen Feature Branch
  3. Committe deine Änderungen
  4. Push zu dem Branch
  5. Erstelle einen Pull Request

Lizenz

Dieses Projekt ist unter der MIT-Lizenz lizenziert. Weitere Details finden Sie in der LICENSE-Datei.

Kontakt

Marco Tozzi - GitHub