私はCで複雑なサーバ - クライアントシステムを開発していましたが、ソケット通信の実装方法はわかりません。任意の双方向UNIXソケット通信
簡単に言えば、システムはデータベースと通信し、UNIXソケットを使用してfork()
で作成された1つ以上の子プロセスと通信するサーバーアプリケーションです。子供の目的はゲームサーバーを稼働させることです。ゲームサーバーを起動するプロセスは次のようになります。
- サーバー/マネージャは、作成するデータベース内のゲームサーバーを識別します。
- マネージャは、子供(「ゲームコントローラ」)をフォークします。
- ゲームコントローラは、2つのパイプペアを設定し、その後フォークを設定し、その子の標準入力をパイプで置き換え、stdoutとstderrを別のパイプで置き換えます。
- ゲームコントローラの子供は
execlp()
を実行して、実際のゲームサーバーの実行ファイルの実行を開始します。
私のソケットに関する経験は、ごくわずかです。 GNU Cのドキュメントhereの簡単な例に示すように、多くのクライアントを「多重化」する前に、サーバアプリケーションでselect()
を使用しました。
私は今、新たな課題を抱えています。マネージャは、ゲームコントローラの子どもたちに任意にコマンドを送信する必要があります(データベースを定期的にチェックすることで見つけることができます)。しかし、でもはそれらからの任意のコマンド/エラーを受け取り、返信を返すことを期待しています。
だから、私はソートがコンテキスト間でのみ意味のある「コンテキスト」システムが必要です。言い換えれば、コマンドがマネージャからゲームコントローラに送信されるとき、各当事者は、誰が尋ねているのかを知る必要があり、返信が何であるかを知る必要があります。
select()
は、受信データがあるときを知っていてスレッドがそれをブロックする必要があるため、データを送信して応答を受け取る別のスレッドが必要ですか?これは、技術的には「クライアント」であるけれども、各ゲームコントローラはリスニングソケットを使用し、select()
も使用する必要がありますか?
システムと問題を簡潔に説明していただきたいと思います。必要に応じて詳細を追加します。ありがとう!
私はそのほとんどを理解していると思いますが、「ソケットは自分の間だけで意味があります」という意味を説明できますか? – frankc
ソケットを介して送信されたコマンドは、あなたが 'accept()'のように応答し、反対方向に流れるソケットを受け取るでしょうか?あるいは、基礎となる外挿プロセスをより効率的に実装する方法があります。 – Doddy
データを受信しているソケットを知っているため、「各パーティは誰に尋ねているのか分からないでしょうか? –