2010-06-28 7 views
0

Comment distinguer les descripteurs de fichiers "listener" des descripteurs de fichiers "client"?epoll: Distinguer les FDs "listener"

Voici ce que j'ai vu dans le manpage exemple:

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

Mais si je n'ai pas accès à listener? Désolé, c'est une question vague. Je ne suis pas sûr de savoir comment le dire.

+0

Vérifiez le libevent - http://monkey.org/~provos/libevent/ - assurez-vous de ne pas réinventer une roue. – Dummy00001

+0

Oui, libevent! La règle des machines d'état! –

+0

Je vais vérifier; Merci. – someguy

Répondre

3

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 .

+0

De cette façon, on peut également associer une fonction de rappel au descripteur de fichier. – Dummy00001

+0

Ouais, c'est un peu ... oh l'horreur ... orienté objet :) –

+0

Vous pouvez certainement mettre un 'goto 'là-dedans, quelque part! +1, j'utilise aussi de petites structures (avec des callbacks * gasp *). –