En supposant que vous écrivez un serveur, vous devez soit garder le descripteur de socket d'écoute autour d'une certaine variable (listener
dans la page de manuel), ou configurer une petite structure pour chaque prise que vous donnez à epoll_ctl(2)
et pointez avec data.ptr
membre du struct epoll_event
(n'oubliez pas de désallouer cette structure lorsque le socket est fermé).
Quelque chose comme ceci:
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 */
}
Comme vous pouvez le voir, il est beaucoup plus de travail puis juste avoir accès au descripteur de socket serveur, mais il a une belle propriété de garder toutes les informations relatives à une prise en un seul endroit .
Vérifiez le libevent - http://monkey.org/~provos/libevent/ - assurez-vous de ne pas réinventer une roue. – Dummy00001
Oui, libevent! La règle des machines d'état! –
Je vais vérifier; Merci. – someguy