1

複数のクライアント接続を同時に処理できる TCP サーバー アプリケーションを C コードで作成しました。サーバーが 1 つのクライアントからデータを受信すると、すべてのクライアントがそれを受信する必要があります。サーバーと複数のクライアント間の接続を作成するためにselect()を使用しましたが、すべてのクライアントが同時に同じデータを受信し、それぞれがデータを送信できるようにする方法がわかりませんサーバ。

read_option(fd) は、アプリケーションで使用される私の関数です

while(1)
{
    select (nfds+1, &readfds, NULL, NULL, &tv);
    if (FD_ISSET (sd, &readfds))
    {
        len = sizeof (from);
        bzero (&from, sizeof (from));
        client = accept (sd, (struct sockaddr *) &from, &len);
        if (client < 0)
        {
            continue;
        }
        if (nfds < client) 
            nfds = client;
        FD_SET (client, &actfds);
        fflush (stdout);
    }
    for (fd = 0; fd <= nfds; fd++)  
    {
        if (fd != sd && FD_ISSET (fd, &readfds))
        {
            if (read_option(fd))
            {
                fflush (stdout);
                close (fd);
                FD_CLR (fd, &actfds);
            }
        }
    }
4

1 に答える 1

1

複数のクライアントから同時に送受信する場合 (少なくとも受信側では)、スレッドを使用する必要があります。これは、すべてのクライアントがサーバーにデータを一度に送信できる方法がなく、各クライアントのパケットが別途取り扱う必要があります。(「read_option」で受信したデータは数バイト以上であり、処理に数マイクロ秒以上かかると想定しています-その仮定が間違っている場合、現在行っていることを実行できる可能性があります-しかし、私はスレッドを使用して解決する方が簡単だと確信しています)。明らかに、十分な数のクライアントがある場合でも、設定された時間内にすべてのパケットを処理するのに十分な CPU またはネットワーク帯域幅がない可能性があります。

マルチキャストを使用してすべてのクライアントに同時に送信することは可能かもしれませんが、すべてのクライアントがデータを同時に受信することを保証することはできません。コンピューターの時刻を同時に話している場合はそうではありません。クライアントがサーバーと同じネットワーク上にあり、人間の反応時間 (0.05 ~ 0.1 秒) について話している場合、おそらくそれを達成できます。マシンがインターネット全体に分散している場合は、0.1 ~ 0.5 秒を達成できれば問題ありませんが、さらに悪化する可能性もあります。

したがって、コメントを考えると:

send()andreceive()で実行しているためread_option()、その時点で read_option がブロックされ、他のクライアントは処理されません。

を使用して、基本的に各クライアントのスレッドを開始する必要がありますpthread_create()。その後、サーバーと各クライアントの間で、互いに独立して「チャット」できます。また、各スレッド間で何らかの同期が必要になると思います。これにより、スレッドが互いに先行して実行されないようにすることができます。私はあなたがどのゲームをプレイしているのかわからないので、「プレイのルール」がどうあるべきかわかりません。それについてコメントすることはできません - 実際、それは別の質問の素晴らしい主題だと思いますこの質問よりも [そうしないと、終わらないのではないかと思います!]

于 2012-12-28T12:30:17.370 に答える