2012-04-09 11 views
-4

サーバーに接続しようとする各クライアント用に新しいスレッドを作成するサーバーを作成する必要があります。各クライアント用に作成された新しいスレッドはクライアントを管理し、サーバープロセスはポートからの新しい接続を待ち受けます。クライアントごとに新しいスレッドを作成するサーバーを作成するにはどうすればよいですか?

私はUnix Cでコードを作成する必要があります。これはできるだけ早く終了する必要があるタスクのサブタスクです。私はこの分野に慣れていないため、サーバーの作成について多くのことを知らない。

+1

いくつかのコードを投稿して、作業するようにしました。 – cnicutar

+2

[スタックオーバーフローは、コードの作成、チュートリアル、またはコンサルティングサービスではありません](http://meta.stackexchange.com/a/128553/172496) –

+0

これを行うサービスを作成する必要がありますか?または新しいサーバーをロードしていて、この方法で構成する必要がありますか? – Brian

答えて

1

基本的には、どのようなあなたが探しているのは、このようなものです:

#include <sys/types.h> 
#include <sys/socket.h> 
#include <pthread.h> 

void* handle_connection(void *arg) 
{ 
    int client_sock = *(int*)arg; 
    /* handle the connection using the socket... */ 
} 

int main(void) 
{ 
    /* do the necessary setup, i.e. bind() and listen()... */ 
    int client_sock; 
    pthread_t client_threadid; 
    while((client_sock = accept(server_sock, addr, addrlen)) != -1) 
    { 
     pthread_create(&client_threadid,NULL,handle_connection,&client_sock); 
    } 
} 

これは、すべての着信クライアント接続のための別のスレッドを作成する、サーバーアプリケーションのためにかなり基本骨格です。 bindlisten、またはacceptがわからない場合は、ローカルマニュアルの2番目のセクションを参照してください。

+2

このコードには、従来の競合状態が含まれています。新しいスレッドに 'client_sock'のアドレスを渡すことはできません。私は '(void *)client_sock'を使用しますが、本当に不快なら、時間とメモリを無駄にして' malloc'を呼び出すか、セマフォーや他の同期オブジェクトを追加します(時間の無駄遣いも)。 –

+0

ありがとう!私は、次回は無用なアセンブリ関連の質問に固執するだろうと思う。 –

+0

少し厳しいため申し訳ありません。しかし、初心者がスレッドの質問をしているときに、古典的なスレッド初心者のミスのいずれかを含む答えを与えるのは、ちょっと面倒です。この答えを使用した人は、おそらく 'accept'が十分に遅いので、競合状態を捕まえることはないでしょう。メインスレッドが変数を上書きするまでに新しいスレッドが開始しなかったことは非常にまれです。 –

関連する問題