1

多くのクライアントを受け入れるようにサーバーを変更するにはどうすればよいですか?

void Serveur()
{//Declaring process variables.
    int server_sockfd, client_sockfd;
    int server_len ; 
    int rc ; 
    unsigned client_len;
    struct sockaddr_in server_address;
    struct sockaddr_in client_address;

    //Remove any old socket and create an unnamed socket for the server.
    server_sockfd = socket(AF_INET, SOCK_STREAM, 0);
    server_address.sin_family = AF_INET;
    server_address.sin_addr.s_addr = htons(INADDR_ANY);
    server_address.sin_port = htons(1111) ; 
    server_len = sizeof(server_address);

    rc = bind(server_sockfd, (struct sockaddr *) &server_address, server_len);
    printf("RC from bind = %d\n", rc ) ; 

    //Create a connection queue and wait for clients
    rc = listen(server_sockfd, 5);
    printf("RC from listen = %d\n", rc ) ; 

    client_len = sizeof(client_address);
    client_sockfd = accept(server_sockfd, (struct sockaddr *) &client_address, &client_len);
    printf("after accept()... client_sockfd = %d\n", client_sockfd) ; 
    char ch[BUFFER_TAILLE];
}
4

2 に答える 2

1

あなたには2つの解決策があります。

于 2012-10-06T09:42:05.600 に答える
0

複数のクライアントを受け入れるには、次のものが必要です。

  1. まず第一に、ソケットはノンブロッキングでなければなりません。つまり、クライアント ソケットで eg read/を呼び出すとrecv、ブロックされませんが、読み取るものがなければすぐに戻ります。
  2. selector poll(または同様の) 関数を使用して、どのソケットの準備ができているかを知る必要があります。
  3. 接続されているすべてのクライアントを追跡する必要があります。これは、実際のソケットを含む各クライアントに関する情報を含む構造のリンクされたリストを保持することによって最も簡単に行われます。
  4. イベントループ。たとえばループ内で呼び出しを続けselect、サーバーソケットまたはクライアントソケットが「準備完了」(つまり、受信できる入力がある)かどうかを確認する必要があります。

インターネット上には、これを行う方法を示す多くの例とチュートリアルがあります。

上記で概説した方法以外にも、これを処理する方法は他にもあります。最も一般的なのは、ソケットをブロックしたままにし、新しい接続が到着したときに、クライアント接続を処理する新しいスレッドまたはプロセスを作成することです。この方法は、クライアント接続が短い、またはアクティブな接続があまりないと予想される Web サーバーなどのサーバーで最も一般的です。

もちろん、プロセス/スレッドが複数の接続を処理するように、メソッドを組み合わせることができます。

于 2012-10-06T09:41:39.527 に答える