Ich habe eine TCP-Server-Anwendung, in der ich beim Empfang einer eingehenden Verbindung, akzeptiere ich die Verbindung und den Socket-Deskriptor zu einer Liste hinzufügen. Der Server benötigt die Liste, damit er die Liste durchlaufen und regelmäßig Daten an alle verbundenen Clients senden kann.hinzufügen/entfernen Socket-Deskriptoren von Poll()
Wenn einer der Clients die Verbindung beendet, muss der entsprechende Socket-Deskriptor aus der Liste gelöscht werden.
Ich habe versucht, die Deskriptoren zu Poll() hinzuzufügen, so dass ich jede geschlossene Verbindung mit möglicherweise POLLHUP erkennen kann, aber ich kann nicht herausfinden, wie Abfrage zu dynamisch hinzufügen Deskriptoren zu seinem Satz auf jeder eingehenden neuen Verbindung zu unterbrechen.
Der Server benötigt nur die Liste der Deskriptoren aller offenen Verbindungen, wann immer er Daten senden will.
Wie gehe ich vor? Irgendwelche Vorschläge?
EDIT: Hier ist, was ich getan habe: Ich habe einen Thread für jeden Client erstellt und seine fd zur Umfrage hinzugefügt. Pseudo-Code auf dem Server:
sockfd = accept the conn.
pthread_create
// Inside the thread, add sockfd to poll
struct pollfd fds[1];
fds[0].fd = sockfd;
poll(fds, 1, 500000);
Check for POLLHUP returned event and see which client(fd) closed the connection.
Dies scheint alle Deskriptoren abzufragen, aber mein Problem ist jetzt, dass, wenn ich mit zwei Schließen der Verbindungen getestet clients..only einer der Deskriptoren gibt POLLHUP.
Nach dem Testen mit mehreren Clients habe ich beobachtet, dass POLLHUP durch das Schließen eines der Sockets ausgelöst wird, mit Ausnahme des ersten Clients, der mit dem Server verbunden ist. – ddd