Как реализовать цикл ожидания сервера для нескольких клиентских подключений - PullRequest
3 голосов
/ 20 июля 2011

Я работаю над проектом клиент-сервер. Он должен иметь возможность обрабатывать несколько (> 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. В настоящее время я использую один цикл ожидания для всех соединений. Это правильно? или какова лучшая практика? Должен ли я использовать цикл ожидания для каждого соединения?

  2. Если я удалю thread::sleep, загрузка моего процессора будет очень интенсивной. Но перерыв в 10 миллисекунд приведет к значительной задержке, особенно, если есть несколько соединений. Так что же такое лучшая практика?

  3. Я гуглил и нашел что-то под названием 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 голос
/ 21 июля 2011

Я бы порекомендовал иметь один основной цикл и использовать select() для управления соединением и сокетами прослушивания.Либо man select_tut, либо посетите http://beej.us/guide/bgnet/ (или оба)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...