Viele Sockets mit select() handeln?
-
Hallo miteinander,
ich würde gern einen Server programmieren, der sehr viele Verbindungen(10000?) handeln kann. Diese Verbindungen laufen zu 99,9% der Zeit im Leerlauf.
Diese Sockets kann man ja alle in eine select()-Konstruktion setzen, damit man weiß, wann ein Socket was zu sagen hat. Schön
Wenn ich das richtig verstanden habe, muss ich nach dem select() jeden socket per IF-Abfrage fragen, ob sich was getan hat, da select mir nicht sagt, welcher socket sich meldet. Das finde ich nicht schön :(. Das wären dann ja immer, wenn ich Pech habe, 10000 if-abfragen. Ich glaube nicht, dass das performant ist....Gibt's da einen besseren Ansatz?
Danke
mfg grossy
-
das funktioniert so erstmal nicht
der kernel ist meist so konfiguriert, dass er nur 1024 filedeskriptoren auf einmal offen haben kann (siehe FD_SETSIZE konstante, oder ausgabe von ulimit -n). wenn du mehr verbindungen offen haben willst, musst du auf alle fälle diese beschränkung erweitern (geht auch mit ulimit), ggf. mehrere prozesse deines servers forken, die wiederum mehrere threads verwalten. im extremsten fall kann man auch einen daemon schreiben der nur für die verwaltung von verbindungen zuständig ist und anfragen entsprechend and andere server weiterleitet, was natürlich nur sinn macht, wenn entsprechende hardware zur verfügung steht. wenn dir konsistenz nicht so wichtig ist, dann kannst du auch das udp protokoll benutzen, dies würde nur einen offenen deskriptor auf serverseite verlangen, die verbindungsverwaltung kannst du dann dynamischer gestalten, so wie du willst.
edit: btw, falsches forum
-
Super, danke für die Antwort
Eröffnet mir zumindest eine neue Sicht auf das ganze
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Rund um die Programmierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
select ist eigentlich outdated. Das Problem ist nur, dass jedes Betriebssystem im Grunde eine eigene alternative API anbietet. Wenn du es dir einfach machen und dennoch portabel sein willst, solltest du dir libevent anschauen.
Auch ein interessanter Artikel zu dem Thema: http://bulk.fefe.de/scalable-networking.pdf
-
Wie schon gesagt, ist select nicht wirklich zu empfehlen. Ist für Prototyping und so ganz nett, aber für dein Szenario nicht geeignet.
Hab vor längerem mal ne schöne Seite gefunden die einiges an interessanten Infos zu bieten hat:
http://tangentsoft.net/wskfaq/articles/index.htmlFür deine Frage im speziellen gibts dazu folgendes:
http://tangentsoft.net/wskfaq/articles/io-strategies.htmlBezieht sich zwar auf WinSockets (was du vielleicht sogar sowieso verwenden wirst?), aber ist auch so allgemein sehr brauchbar, da die Konzepte ja eigentlich plattform-übergreifend sind.
-
epoll, kqueue, libevent. Nur eben nicht select.