Я пишу 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