7.e.Q
20-01-2005, 08:25
Hallo,
ich habe einen "kleinen" Server geschrieben, der TCP Verbindungen annehmen soll. Jemand anderes bei uns im Team hat den Client geschrieben. Nun haben wir das Problem, daß es häufig vorkommt, daß der Server angeblich eingehende Verbindungen erkennt und dementsprechend mit einem accept() reagiert. Nur dieses accept blockiert dann. Wäre der FD auf O_NONBLOCK gesetzt, bekäme ich an der Stelle ein EAGAIN oder ein EWOULDBLOCK in errno zurück. Hab ich schon ausprobiert.
Gepollt wird u.a. der Filedeskriptor des Serversockets mit select(). Jeder Client bekommt ein Client-Objekt, welches einem Array in der Server-Klasse hinzugefügt und bei Beendigung der Verbindung wieder entfernt wird. Der Server kann derer 15 ab. Wir bauen maximal 8 Verbindungen gleichzeitig auf, sprich es sind immer mindestens 7 Client-"Slots" frei.
Warum meldet mir jetzt select, daß eine Verbindung ansteht (also im FDSET in select ist das Bit für den Server-Socket gesetzt und select kehrt vor Ablauf seines Timeouts zurück), das danach aufgerufene accept zur Annahme der Verbindung blockiert aber, bzw. würde mit oben genannten Fehlermeldungen zurück kehren.
Ich weiß nicht, wo das Problem ist... Ich hab nichts weiter gemacht, als
socket()
bind()
listen()
danach den von socket zurück gegebenen FD in ein FDSET geschrieben. Jenes FDSET wird in der Hauptschleife kopiert und an select übergeben.
Auf ein zurückkehren von select folgt die Überprüfung, ob sich der FD des Serversockets noch im an select übergebenen FDSET befindet, bzw. das entsprechende Bit gesetzt ist. Ist es gesetzt, steht laut select eine Verbindung an. Darauf folgt unmittelbar ein accept(), dessen zurück gelieferter FD bei Erfolg ebenfalls in das FDSET für select eingetragen wird.
Nur dieser Erfolg bleibt eben in manchen Fällen aus. Ich will nicht mit O_NONBLOCK arbeiten. Ich will, daß der Verbindungsaufbau vernünftig funktioniert.
Mir würde schon reichen, wenn mir jemand sagen könnte, ob dieses merkwürdige Verhalten auf Server- oder auf Client-Seite verursacht wird.
ich habe einen "kleinen" Server geschrieben, der TCP Verbindungen annehmen soll. Jemand anderes bei uns im Team hat den Client geschrieben. Nun haben wir das Problem, daß es häufig vorkommt, daß der Server angeblich eingehende Verbindungen erkennt und dementsprechend mit einem accept() reagiert. Nur dieses accept blockiert dann. Wäre der FD auf O_NONBLOCK gesetzt, bekäme ich an der Stelle ein EAGAIN oder ein EWOULDBLOCK in errno zurück. Hab ich schon ausprobiert.
Gepollt wird u.a. der Filedeskriptor des Serversockets mit select(). Jeder Client bekommt ein Client-Objekt, welches einem Array in der Server-Klasse hinzugefügt und bei Beendigung der Verbindung wieder entfernt wird. Der Server kann derer 15 ab. Wir bauen maximal 8 Verbindungen gleichzeitig auf, sprich es sind immer mindestens 7 Client-"Slots" frei.
Warum meldet mir jetzt select, daß eine Verbindung ansteht (also im FDSET in select ist das Bit für den Server-Socket gesetzt und select kehrt vor Ablauf seines Timeouts zurück), das danach aufgerufene accept zur Annahme der Verbindung blockiert aber, bzw. würde mit oben genannten Fehlermeldungen zurück kehren.
Ich weiß nicht, wo das Problem ist... Ich hab nichts weiter gemacht, als
socket()
bind()
listen()
danach den von socket zurück gegebenen FD in ein FDSET geschrieben. Jenes FDSET wird in der Hauptschleife kopiert und an select übergeben.
Auf ein zurückkehren von select folgt die Überprüfung, ob sich der FD des Serversockets noch im an select übergebenen FDSET befindet, bzw. das entsprechende Bit gesetzt ist. Ist es gesetzt, steht laut select eine Verbindung an. Darauf folgt unmittelbar ein accept(), dessen zurück gelieferter FD bei Erfolg ebenfalls in das FDSET für select eingetragen wird.
Nur dieser Erfolg bleibt eben in manchen Fällen aus. Ich will nicht mit O_NONBLOCK arbeiten. Ich will, daß der Verbindungsaufbau vernünftig funktioniert.
Mir würde schon reichen, wenn mir jemand sagen könnte, ob dieses merkwürdige Verhalten auf Server- oder auf Client-Seite verursacht wird.