epoll: отличительные «слушающие» FDs - PullRequest
0 голосов
/ 28 июня 2010

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

Вот что я увидел на manpage пример:

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

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

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

1 Ответ

3 голосов
/ 28 июня 2010

Предполагая, что вы пишете сервер, вы должны либо оставить дескриптор сокета прослушивания в некоторой переменной (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 */
}

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

...