C++ 如何为多个客户端连接实现服务器等待循环

C++ 如何为多个客户端连接实现服务器等待循环,c++,client,C++,Client,我正在做一个客户机-服务器项目。它应该能够处理多个>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 practic

我正在做一个客户机-服务器项目。它应该能够处理多个>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);
}
我的问题是:

目前,我对所有连接使用一个等待循环。这是正确的吗?或者最佳实践是什么?我应该为每个连接使用等待循环吗

如果我删除thread::sleep,我的CPU使用将非常密集。但是睡眠10毫秒会导致明显的延迟,特别是在有多个连接的情况下。那么最佳实践是什么

我在谷歌上搜索,发现了一个叫做FD_ISSET的东西:

但我不知道怎么用?如何将其用于套接字文件描述符


不确定我是否说得很清楚。

我建议您有一个主循环,并使用select管理连接和侦听套接字。
要么选择_tut或visit,要么两者都选择

嗨,Josh,谢谢你的回复。我将采纳您的建议,使用一个主循环并监视选择所有侦听套接字:一旦其中一个或多个从客户端获取数据,与套接字关联的连接将处于活动状态并处理传入的数据。这种设计可以吗?您也可以并且应该为连接的套接字使用select-您可以使用它来处理何时可以发送/接收数据。作为旁注,请确保您考虑到您没有发送/接收所有预期数据的情况。
/* 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);