2014-12-19 2 views
0

Я использую системный вызов epoll для обработки нескольких клиентов в разговоре TCP.использование void * ptr и int fd в структуре данных epoll в то же время

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

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

+0

Как вы это делаете сейчас? –

+0

В настоящее время я могу сравнить 'fd' конкретного клиента. Я хочу сопоставить объект с конкретным 'fd'. Поэтому предположим, что у меня есть 5 соединений, каждое соединение будет иметь другой объект. Поэтому я могу вызвать правильный объект для каждого 'fd'. – anurudh

ответ

0

Вы используете союз для своего epoll_data_t. Таким образом, он может хранить только одно из полей. Так что либо ваш void *, 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) 
} 

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

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