0

Ich habe eine Server-Client-Anwendung in C++ auf Linux geschrieben. Wenn ein Client eine Verbindung mit meinem Server herstellt, erstellt der Server einen Thread, der darauf wartet, dass der Client die auszuführenden Serverbefehle sendet. Die Befehle sind vom Betriebssystem abhängig. Der Thread, mit dem der Client mit dem Server kommuniziert, ruft globale Funktionen auf, die den vom Client gewünschten Befehl ausführen. Also muss ich zwei Funktionen für jeden Betriebssystem-abhängigen Befehl haben, den der Client an den Server zur Ausführung sendet. Alle diese globalen Funktionen sind im selben Header wie die Hauptthread-Funktion definiert. Es wird ein bisschen unordentlich mit all diesen Funktionen für verschiedene Betriebssysteme. Meine Idee ist, zwei Klassen zu schreiben, die WindowsFuncs und LinuxFuncs heißen, die statische Elementfunktionen haben, die den erforderlichen Befehl für das OS ausführen, für das die Klasse entworfen wurde. Was sind einige Stackoverflow-Ideen zum Reinigen meiner Logik?Server-Client-App, ich habe Probleme, eine saubere Möglichkeit, Client-Daten auf der Serverseite zu verarbeiten

Antwort

0

Dies klingt nicht wie ein Threading-Problem. Klingt wie Sie einfache Vererbung verwenden können.

etwas verwenden wie

abstract class OSMethods { 
    void listDir(); 
} 

class OSMethodsLinux : OSMethods { 
    void listDir() { system.exec("ls"); } 
} 
class OSMethodsWin : OSMethods { 
    void listDir() { system.exec("dir"); } 
} 

Dann Server-Client-Verarbeitungscode hat Methode, wie

void accept(Socket s, OSMethods m) { 
    s.readCommand(); 
    m.listDir(); // or whatever 
    } 

Stellen Sie sicher, korrekte Instanz übergeben entweder Linux oder Win-Klasse zu übernehmen. Also keine statischen Methoden.

Generell habe ich festgestellt, dass Sie keine statischen Methoden in Ihren Programmen benötigen (außer Main), es sei denn, Sie machen clevere Sachen, die meisten Dinge brauchen sie einfach nicht und sie führen zu weniger flexiblem Design.

+0

Zufällige Frage: Ich möchte der Thread sicher alle diese Funktionen aufrufen, wo würde ich die Mutex-Variable für diese Klassenmethoden platzieren? – TheFuzz

+0

Fügen Sie einen einzelnen Mutex in die einzelne Instanz von OSMethodsXXX ein, die jede Methode in OSMethodsXXX zu Beginn der Methode erhält und nach Abschluss der Methode freigibt. Stellen Sie sicher, dass Sie nur eine einzige Instanz von OSMethodsXXX erstellen. – DaveC

+0

da ich auf einer Linux-Box aufbaue, wie kann ich Windows-Code dort drin lassen, damit ich es nicht kommentieren muss, bevor ich baue? nur ifdefs? – TheFuzz

Verwandte Themen