C++ 如何为多个客户端连接实现服务器等待循环
我正在做一个客户机-服务器项目。它应该能够处理多个>1000个客户端连接 我的服务器端等待循环的主要框架如下所示: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
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);