Я использую epoll
системный вызов для обработки более одного клиента в диалоге TCP.
Я зарегистрировался epoll
с фд:
epoll_ctl (efd, EPOLL_CTL_ADD, fd, &event);
и может использовать для сравнения fd как:
if(conn->getSockfd() == events[i].data.fd)
// ....
Но как структура данных epoll
typedef union epoll_data {
void *ptr;
int fd;
uint32_t u32;
uint64_t u64;
} epoll_data_t;
Я хочу сопоставить объект (функцию) fd
поле, так что я могу вызвать эту функцию после сравнения.
Но я не получаю правильный результат. Это можно сделать или нет? Если да, то я могу это использовать?
Вы используете объединение для своего epoll_data_t. Таким образом, он может хранить только одно из полей за раз. Так что либо ваша пустота *, int, что угодно.
Я заметил, что вы пометили свой вопрос с C ++, поэтому вот я подхожу к проблеме:
Вы можете связать дескриптор и функцию вместе в классе / структуре, а затем создать новый экземпляр для каждого соединения, которое вы принимаете / создаете. Во время строительства вы можете передать FD и функцию в ваш новый объект.
Вот быстрая и непроверенная концепция этого:
template < typename FunctionType >
struct Connection
{
int FD;
std::function< FunctionType > DoStuff;
Connection( int descriptor, const std::function< FunctionType >& Func )
: FD ( descriptor )
, DoStuff ( Func )
}
Затем вы можете вызвать конструктор, передать ему свой файловый дескриптор и функцию для выполнения с помощью std :: bind, а затем вызвать его, выполнив Connection.DoStuff ().
Вы можете сойти с ума с параметрами и тому подобное, если вы используете заполнители и тому подобное. Для получения дополнительной информации о станд :: привязывать а также станд :: функция перейдите по гиперссылкам.