2011-03-01 29 views
2

私はシンプルなマルチプロセス(スレッドではない)サーバーを作りたいと思います。私は一度に1つの要求を処理する反復的な例を見てきました。 代わりに、私は同時に多くのリクエスト(10件以上)を処理する必要があります。boost :: asio serverマルチプロセス

int listensd, connsd; // listening socket and conection socket 
pid_t pid;   //process id 
listensd=socket(....); 
bind(listensd,...); 
listen(listensd,...); 
for(;;) 
{ 

    connsd=accept(listensd,...); 
    if((pid=fork())==0) //child process 
    { 
     close(listensd); //close the listen socket 
     do_it(connsd); //serve the request 
     close(connsd); //close the connection socket 
     exit(0); 
    } 
close(connsd);  //the parent closes the connection socket 
} 

はブーストでそのような何かをすることが可能です: は、古典的なCおよびC++の例では、私は、サーバーは、次のように設計されていることを見てきましたか?私は実際にすべての機能(listenbindacceptなど)を無効に戻すので、2つの異なるソケットを取得する方法を知りません。

+0

接続ごとにプロセスが必要なのはなぜですか?このようなデザインは単純に拡張されておらず、実際にはBoost.Asioによって推進される非同期デザインパターンの精神ではありません。 –

+1

できることは間違いありません。マルチスレッドの例の1つを見て、それが通常別のスレッドを開始するところで、代わりにforkすることができます。 – Matt

+0

これは、 'boost :: asio'とどの部分が関係していますか? AFAIK、投稿されたコードはすべてPOSIXです! –

答えて

0

はい、Boost.Asioを使用して接続ごとにプロセスをフォークすることは可能です。関連するBoost.Asioタイプへのbindlistenacceptのマッピングについては、BSD Socket API Boost.Asioのドキュメントを参照してください。

私のコメントで指摘したように、私はこのデザインがうまくスケールされているとは感じません。あなたは、非同期のデザインパターンを学び、Boost.Asioライブラリの本当の強みを活用する方がよいでしょう。詳細については、C10K problemを参照してください。