epoll: Zeichnende „Zuhörer“ FDs
Frage
Wie kann ich unterscheiden zwischen „Hörer“ Filedeskriptoren und „Client“ Datei-Deskriptoren?
Hier ist, was ich sah in dem manpage Beispiel:
if(events[n].data.fd == listener) {
...
} else {
...
}
"Aber was ist, wenn ich keinen Zugang zu listener
?
Sorry, wenn dies ist eine vage Frage. Ich bin mir nicht ganz sicher, wie man es Wort.
Lösung
Angenommen, Sie einen Server zu schreiben, sollten Sie entweder halten den Socket-Descriptor um in einigen Variablen (listener
in der Handbuchseite) oder Einrichtung eine kleine Struktur für jeden Sockel Sie epoll_ctl(2)
und Punkt geben, um es mit data.ptr
Mitglied die struct epoll_event
(vergessen Sie nicht, dass die Struktur, um de-zuteilen, wenn Socket geschlossen ist).
So etwas wie folgt aus:
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 */
}
Wie Sie sehen, es ist viel mehr Arbeit als nur mit Zugriff auf den Server-Socket-Descriptor, aber es hat eine schöne Eigenschaft, alle Informationen halten an einem Ort zu einer Steckdose bezogen.