2012-03-23 17 views
0

私はPthreadsを使用してCでマルチスレッドWebサーバーを設計しようとしていますが、サービスを提供せずにより多くの着信接続を受け入れることに問題があります。ソケットファイルディスクリプタをバッファに入れ、着信接続の受け入れを続ける方法は?

クライアント接続を受け入れるためにデフォルトのaccept(2)を使用して、スレッドによってpocessされるバッファに、受け取った各接続のファイル記述子を入れたいとします。

選択する必要がありますか?なにか提案を ?

+0

簡単なコーディングや高性能をお探しですか?あなたはそれを自分でやりたいのですか、図書館を使いたいですか?パフォーマンスを気にする人は、高いスループットや多数の接続、あるいはその両方が必要ですか? –

+0

@DavidSchwartzそのライブラリと簡単なコーディングを使用する方が良いのは、その設計の一部なので、私は接続数をテストするだけです。 – CodeRed

+0

次に、Boost :: asioまたはlibeventを見てください。 –

答えて

0

マルチスレッドサーバを行うための一般的な方法は、あなたが新しい接続を受け入れた直後に、新しいスレッドを作成することです、そして:あなたがあなた自身の手でコードをしたい場合は

、(パフォーマンスのアイデア)を見て新しいソケットをそのスレッドに渡します。このようなもの:

int main(int argc, char *argv[]) 
{ 
    /* ... */ 
    int client_socket = accept(server_socket); 

    pthread_create(&thread, NULL, my_connection_handler, (void *) client_socket); 
    /* ... */ 
} 

void *my_connection_handler(void *argp) 
{ 
    int socket = (int) argp; 

    write(socket, "Hello!\r\n", 8); 

    close(socket); 

    return NULL; 
} 
+1

これは最も簡単な方法で、通常は最初に学習する方法ですが、パフォーマンスはひどいことに注意してください。あなたは新しいスレッドを作成し、新しい接続のサービスを開始する前にCPUを取得するのを待つ必要があります。さらに悪いことに、100の接続ごとに少しずつ作業を行うには、100のコンテキストスイッチが必要です。また、スレッドが共通のデータ構造にアクセスすると、それらのデータ構造の同期から悪い動作が発生します。 –

+0

@DavidSchwartz私はワーカースレッドの固定サイズのプールを使用し、ミューテックスまたはセマフォを使用して共有メモリを同期すると、ワーカースレッドに渡されたときにconnectoinを受け取り始めます。 – CodeRed

+1

@CodeRed:これは一般的なやり方です。私が上で説明した多くの理由ではまだまだ大きなものではありません。コンテキストスイッチをたくさん必要とし、多数のスレッド(クライアントごとに1つ)が同期を非効率にします。たとえば、80個のクライアントごとに少しのデータが入ってくるので、80個のスレッドはすべて、80個のスレッドが順番に取得している同じ同期オブジェクト上でブロックするだけです。理由なくコンテキストスイッチを実行します)。 –