Sockets - wie testen ob jemand verbinden möchte?
-
Hallo, beschäftige mich seit Gestern mit Sockets. Nun möchte ich zur Vertiefung einen simplen multiuser Chat schreiben, jedoch habe ich folgendes Problem:
Der Server sollte in meinem Model zuerst gucken ob neue Leute dem Chat beitreten wollen, dann gucken ob jemand etwas zu sagen hat, und, falls dies so ist, die Nachricht an alle weiterschicken. Jedoch gibt es soweit ich gelesen habe, keine Funktion um zu sehen ob jemand connecten möchte, sondern nur die Funktion accept(), die den Server blockt.
In den Beispielen die ich gesehen habe, wird nun für jeden Benutzer ein neuer Thread aufgerufen, der diesen Benutzer behandelt. Dies halte ich für einen Chat jedoch nicht für sehr sinnvoll.
Nun dachte ich, man könnte vielleicht den "Accept()-Teil" in einen eigenen Thread verlagern. Ist dies sinnvoll bzw. überhaupt möglich? Wie wird dies bei anderen Programmen, z.B. mIRC gelöst?mfG
-
-
Wobei select und poll aber nicht 100% sicher sind. Wenn select oder poll zurückliefern, dass eine Verbindung wartet, dann kann es sein, dass diese Verbindung in der Zwischenzeit schon wieder geschlossen wird. Wenn man dann accept aufruft, ist die Anwendung doch wieder blockiert, bis eine neue Verbindung eingeht. Ist mir mal passiert, als ich eine Serveranwendung mit einem Bot getestet habe, der zufällig Aktionen durchgeführt hat, und dabei zufällig eben auch direkt nach begonnenem Verbindungsaufbau die Verbindung schon wieder geschlossen hat.
Wenn man also das Blockieren durch Accept vollständig ausschließen will, sollte man den Socket auf non-blocking setzen. Geht unter Windows mit ioctlsocket, bei BSD-Sockets mit fcntl.
-
setblocking(0) funktionert nicht, da ich Python verwende! Zudem habe ich gelesen, dass es sehr systembremsend sein soll! Mit select funktioniert's jetzt, danke! Kann man das oben genannte Problem denn irgendwie umgehen?
-
Keiner ne Ahnung?