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