0

Linux上のC++で書かれたサーバークライアントアプリケーションがあります。クライアントが自分のサーバーに接続すると、サーバーはクライアントが実行するサーバーコマンドを送信するのを待つスレッドを生成します。コマンドはOSに依存します。クライアントがサーバと通信しているスレッドは、クライアントが要求する必要なコマンドを実行するグ​​ローバル関数を呼び出します。だから私は、クライアントが実行するサーバーに送信するコマンドに依存するすべての2つの機能を持っている必要があります。これらのグローバル関数はすべて、メインスレッド関数と同じヘッダに定義されています。これは、異なるOSのために、これらすべての機能を少しばかり乱雑にしています。私の考えは、WindowsFuncsとLinuxFuncsと呼ばれる2つのクラスを記述することです。このクラスは、そのクラスが設計されたOSに対して必要なコマンドを実行する静的メンバ関数を持っています。私のロジックをきれいにする方法に関するstackoverflowsのアイデアは何ですか?サーバークライアントアプリケーションで、サーバー側でクライアントデータを処理するためのきれいな方法を考えています

答えて

0

これはスレッドの問題のようには聞こえません。 単純な継承を使用できるように思えます。その後、サーバー、クライアントの処理コードが

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

ような方法は、Linuxまたは勝利クラスのいずれかの受け入れを正しいインスタンスを渡していることを確認してい

abstract class OSMethods { 
    void listDir(); 
} 

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

のようなものを使用して

。 静的メソッドはありません。

一般的に私は、あなたが巧妙なものをやっていない限り、あなたのプログラムに静的メソッドが必要ないことを知りました。ほとんどのものはそれを必要とせず、柔軟性に欠ける設計になります。

+0

ランダム質問:これらの関数のすべてをスレッドが安全に呼び出すようにしたいので、これらのクラスメソッドのmutex変数はどこに置くのですか? – TheFuzz

+0

OSMethodsXXXの1つのインスタンスの中に1つのミューテックスを置きます。これは、メソッドの開始時にOSMethodsXXXのすべてのメソッドが取得し、完了すると解放します。 OSMethodsXXXのインスタンスを1つだけ作成してください。 – DaveC

+0

私はLinuxのボックスにビルドしているので、ビルドする前に、コメントを残しておく必要がないように、Windowsのコードをそこに残すことはできますか?ちょうどifdefs? – TheFuzz

関連する問題