0

複数のクライアントにサービスを提供するデータディストリビューター(乱数の生成など)を設計しています。

クライアント C は、最初に関心のある番号のリストを TCP 経由で DD に送信し、UDP でデータをリッスンします。しばらくすると (数分)、クライアントは DD にさらに番号を送信して、サブスクリプション リストを更新できます。

これを 2 つの方法で設計できます。

最初:

New_Client_Connected_Thread(int sock_fd)
{
    --Get Subscription
    --Add to UDP Publisher List
    --close(sock_fd)
}

クライアントが新しいデータ セットをサブスクライブするたびに、新しい TCP 接続が確立されます。

2番目:

New_Client_Connected_Thread(int sock_fd)
    {
        while(true)
        {
            --wait for new subscription list
            --Get subscription
            --Add to UDP Publisher List.

        }
    }

ここでは、クライアントごとに 1 つの TCP 接続のみが必要になります。

ただし、クライアントが新しいリクエストを送信しない場合、Client_Thread は不必要に長時間待機することになります。

私の Data Distributor が多くのクライアントにサービスを提供することを考えると、それらのどれが効率的な方法であると思われますか?

4

1 に答える 1

2

イベント駆動型ループをサポートする libevent または libev は、おそらくこれの TCP 部分により適しています。

スレッド化を回避し、TCP 部分に単一のループを作成して、クライアントをパブリッシャーのリストに追加することができます。Libevent は、1 秒あたりの大量の接続とソケット ティアダウンの管理に非常に効率的であり、Tor (The onion router) などで使用されます。

アプリケーションのTCP接続は「コントロールプレーン」接続のように思われるため、クライアントがソケットを開いたままにするかどうかを決定するサーバーを「制御」する必要がある頻度に依存する可能性がありますまたは制御後に閉じます。数千の TCP 接続を開いたままにしておくと、ホストのカーネル リソースが永続的に使用されることに注意してください。ただし、他の接続では、接続を開いたり閉じたりすると、接続のセットアップ時間による遅延が発生します。

libevent TCP サーバーの例については、https://github.com/libevent/libevent/blob/master/sample/hello-world.cを参照してください。

あなたは C++ でコーディングしているので、libeventのhttp://llucax.com.ar/proj/eventxx/ラッパーに興味があるでしょう。

于 2013-10-16T10:19:04.817 に答える