0

J'ai une application cliente de serveur écrite en C++ sous Linux. Lorsqu'un client se connecte à mon serveur, le serveur génère un thread qui attend que le client envoie les commandes du serveur à exécuter. les commandes dépendent du système d'exploitation. le thread sur lequel le client dialogue avec le serveur appelle les fonctions globales qui exécutent la commande requise par le client. Je dois donc avoir deux fonctions pour chaque commande dépendante du système d'exploitation que le client envoie au serveur pour être exécuté. Toutes ces fonctions globales sont définies dans le même en-tête que la fonction de thread principale. Cela devient un peu compliqué avec toutes ces fonctions pour différents systèmes d'exploitation. Mon idée est d'écrire deux classes appelées WindowsFuncs et LinuxFuncs qui ont des fonctions membres statiques qui exécutent la commande requise pour le système d'exploitation pour lequel la classe a été conçue. Quelles sont certaines des idées de stackoverflows sur la façon de nettoyer ma logique?Application cliente de serveur, j'ai de la difficulté à trouver une façon propre de traiter les données client côté serveur

Répondre

0

Cela ne sonne pas comme un problème de thread. On dirait que vous pouvez utiliser l'héritage simple.

En utilisant quelque chose comme

abstract class OSMethods { 
    void listDir(); 
} 

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

code de traitement client alors serveur a comme méthode

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

Assurez-vous que vous passez par exemple correct d'accepter de Linux ou Win classe. Donc, pas de méthodes statiques. En général, j'ai trouvé que vous n'avez pas besoin de méthodes statiques dans vos programmes (sauf main), sauf si vous faites des trucs intelligents, la plupart n'ont pas besoin d'eux et ils mènent à une conception moins flexible.

+0

Question aléatoire: Je veux que le thread appelle toutes ces fonctions en toute sécurité alors où placer la variable mutex pour ces méthodes de classe? – TheFuzz

+0

Placez un seul mutex dans l'instance unique de OSMethodsXXX que toutes les méthodes de OSMethodsXXX obtiennent au début de la méthode et les libèrent une fois terminé. Assurez-vous que vous ne faites qu'une seule instance de l'OSMethodsXXX. – DaveC

+0

depuis que je construis sur une machine linux, comment puis-je laisser le code de Windows là-bas pour que je n'aie pas besoin de le commenter, avant de le construire? juste ifdefs? – TheFuzz