2011-07-20 14 views
3

私はクライアントサーバープロジェクトで作業しています。複数(> 1000)のクライアント接続を処理できる必要があります。複数のクライアント接続用にサーバー待機ループを実装する方法

私のサーバー側の主骨格が待っているループは次のようになります。

while(server->running) 
{ 
    // If I remove this, my CPU use will be very intensive 
    // but putting 10 milliseconds sleep will cause a significant delay 
    // What's is the best practice? 
    boost::this_thread::sleep(boost::posix_time::milliseconds(10)); 

    if (server->connectionQueue.empty()) 
     continue; 

    Connection* conn = server->connectionQueue.front(); 
    server->connectionQueue.pop(); 

    Stream* stream = conn->HandleData(); 

    // More steps if needed here 

    server->connectionQueue.push(conn); 
} 

私の質問は以下のとおりです。

  1. は現在、私はすべての接続のための1つの待機ループを使用しています。これは正しいです?またはベストプラクティスは何ですか?各接続に待機ループを使用する必要がありますか?

  2. thread::sleepを削除した場合、私のCPU使用量は非常に多くなります。しかし、10ミリ秒のスリープを設定すると、特に複数の接続がある場合には大幅な遅延が発生します。だからベストプラクティスは何ですか?

  3. 私はGoogleで検索し、FD_ISSETと呼ばれるものが見つかりました:http://linux.die.net/man/3/fd_isset

/* According to POSIX.1-2001 */ 
#include <sys/select.h> 

/* According to earlier standards */ 
#include <sys/time.h> 
#include <sys/types.h> 
#include <unistd.h> 

int select(int nfds, fd_set *readfds, fd_set *writefds, 
      fd_set *exceptfds, struct timeval *timeout); 

void FD_CLR(int fd, fd_set *set); 
int FD_ISSET(int fd, fd_set *set); 
void FD_SET(int fd, fd_set *set); 
void FD_ZERO(fd_set *set); 

#define _XOPEN_SOURCE 600 
#include <sys/select.h> 

int pselect(int nfds, fd_set *readfds, fd_set *writefds, 
      fd_set *exceptfds, const struct timespec *timeout, 
      const sigset_t *sigmask); 

をしかし、私は使用する方法がわかりませんか?私はそれを私のソケットファイル記述子に使うことができますか?

わからない場合は、私は明らかにしました。

答えて

1

メインループが1つあり、接続とリスニングソケットを管理するのにselect()を使用することをお勧めします。 またはhttp://beej.us/guide/bgnet/(またはその両方)をご覧ください。

+0

こんにちはジョシュ、お返事ありがとうございます。 1つのメインループを使用し、すべてのリスニングソケットを監視(select())する方法を提案します。クライアントから1つ以上のデータが取得されると、ソケットに関連付けられた接続がアクティブになり、処理されます入ってくるデータこのデザインは大丈夫ですか? –

+0

接続されたソケットにはselect()を使用することもできますし、使用することもできます。データを送受信できるときは、これを使用して処理できます。補足として、あなたが期待したすべてのデータを送受信しない状況を考慮してください。 – Josh

関連する問題