Как использовать epoll_wait в цикле принятия TCP-сервера?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как использовать epoll_wait в цикле принятия TCP-сервера?

Сообщение Anonymous »

Я пишу TCP-сервер на C++ в Linux и в настоящее время пытаюсь перейти от пула потоков к системе ввода-вывода, управляемой событиями, с использованием epoll. Мой сервер в настоящее время создает сокет прослушивания, затем принимает клиентов в цикле и добавляет каждое соединение в пул потоков. Это работает, но из соображений производительности его следует использовать только в целях тестирования. Итак, я начал пытаться внедрить epoll в свой текущий код, но не совсем понимаю, как его правильно использовать. В настоящее время я создаю новый экземпляр epoll, который регистрирует мой ListenSocket

Код: Выделить всё

epoll_fd = epoll_create1(0);
if (epoll_fd == -1) {
log(LogType::Error, "Failed to create epoll file descriptor");
}

epoll_event ev{};
ev.events = EPOLLIN;
ev.data.fd = listenSocket;

if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, listenSocket, &ev) == -1) {
close(epoll_fd);
log(LogType::Error, "Failed to add file descriptor to epoll");
}
На этом этапе я не знаю, что делать дальше. В этом вопросе (С++, смущенный epoll и сокетом fd в системах Linux и асинхронных потоках) следующим шагом было использование epoll_wait и «решение, какой дескриптор файла [был] возвращен epoll». Но разве не странно использовать функцию блокировки потоков при попытке построить асинхронный сервер? Итак, у меня есть несколько вопросов:
  • Какова цель epoll_wait в серверном цикле?
  • Как это заменяет мой цикл Accept()?
  • В какой момент клиентские сокеты добавляются в epoll?
  • Если epoll_wait блокируется, в чем разница от использования Accept()?
  • Как бы вы вообще определили дескриптор файла?
Если вы знаете, что мне следует делать на этом этапе, скажите мне :)

Подробнее здесь: https://stackoverflow.com/questions/798 ... ccept-loop
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»