私はクライアントサーバープロジェクトで作業しています。複数(> 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つの待機ループを使用しています。これは正しいです?またはベストプラクティスは何ですか?各接続に待機ループを使用する必要がありますか?
thread::sleep
を削除した場合、私のCPU使用量は非常に多くなります。しかし、10ミリ秒のスリープを設定すると、特に複数の接続がある場合には大幅な遅延が発生します。だからベストプラクティスは何ですか?私は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つのメインループを使用し、すべてのリスニングソケットを監視(select())する方法を提案します。クライアントから1つ以上のデータが取得されると、ソケットに関連付けられた接続がアクティブになり、処理されます入ってくるデータこのデザインは大丈夫ですか? –
接続されたソケットにはselect()を使用することもできますし、使用することもできます。データを送受信できるときは、これを使用して処理できます。補足として、あなたが期待したすべてのデータを送受信しない状況を考慮してください。 – Josh