epoll: Различение FD слушателей

Как я могу различать файловые дескрипторы «слушателя» и «клиентские» файловые дескрипторы?

Вот что я увидел в примере справочной страницы:

if(events[n].data.fd == listener) {
    ...
} else {
    ...
}

«Но что, если у меня нет доступа к listener?

Извините, если это расплывчатый вопрос. Я не совсем уверен, как это сказать.


person someguy    schedule 28.06.2010    source источник
comment
Проверьте libevent — monkey.org/~provos/libevent — убедитесь, что вы не изобретаете заново рулевое колесо.   -  person Dummy00001    schedule 28.06.2010
comment
Да, либевент! Государственные машины правят!   -  person Nikolai Fetissov    schedule 28.06.2010


Ответы (1)


Предполагая, что вы пишете сервер, вы должны либо сохранить дескриптор прослушиваемого сокета в какой-либо переменной (listener на странице руководства), либо настроить небольшую структуру для каждого сокета, который вы даете epoll_ctl(2), и указать на него с помощью data.ptr члена struct epoll_event ( не забудьте отменить выделение этой структуры при закрытии сокета).

Что-то вроде этого:

struct socket_ctl
{
    int fd;    /* socket descriptor */
    int flags; /* my info about the socket, say (flags&1) != 0 means server */
    /* whatever else you want to have here, like pointers to buffers, etc. */
};
...
struct socket_ctl* pctl = malloc( sizeof( struct socket_ctl ));
/* check for NULL */
pctl->fd = fd;
pctl->flags = 1; /* or better some enum or define */
struct epoll_event ev;
ev.events = EPOLLIN|...;
ev.data.ptr = pctl;
...
if (( events[n].data.ptr->flags & 1 ) != 0 )
{
    /* this is server socket */
}

Как вы можете видеть, это намного больше работы, чем просто доступ к дескриптору сокета сервера, но у него есть хорошее свойство хранить всю информацию, относящуюся к одному сокету, в одном месте.

person Nikolai Fetissov    schedule 28.06.2010
comment
Таким образом, можно также связать функцию (функции) обратного вызова с файловым дескриптором. - person Dummy00001; 28.06.2010
comment
Ага, какая-то... о ужас... объектно-ориентированная :) - person Nikolai Fetissov; 28.06.2010
comment
Наверняка где-то там можно разместить goto! +1, я также использую небольшие структуры (с обратными вызовами журнала вздох). - person Tim Post♦; 28.06.2010
comment
Это то, что я тоже имел в виду, но хотел более простое решение. Это будет еще сложнее, так как я собирался иметь отдельную структуру для клиентских сессий (содержащую не только fd и флаги)! Чувствует себя неправильно. В любом случае спасибо за помощь. Поставить галочку :) - person someguy; 28.06.2010