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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top