использование void * ptr и int fd в структуре данных epoll одновременно

Я использую 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 поле, так что я могу вызвать эту функцию после сравнения.

Но я не получаю правильный результат. Это можно сделать или нет? Если да, то я могу это использовать?

0

Решение

Вы используете объединение для своего 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 ().

Вы можете сойти с ума с параметрами и тому подобное, если вы используете заполнители и тому подобное. Для получения дополнительной информации о станд :: привязывать а также станд :: функция перейдите по гиперссылкам.

0

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector