4Danke
ERLEDIGT
JA
JA
ANTWORTEN
7
7
ZUGRIFFE
272
272
EMPFEHLEN
-
Hallo,
Ich möchte gerne einen Server programmieren der über 1000 Verbindungen schnell und ohne riesigen Rechenaufwand verwalten kann. Welche Methode ist hier für das Handling der Sockets am besten anzuwenden?
- Mit select()
- Für jede Verbindung einen Thread erzeugen
- Für jede Verbindung einen Prozess machen
- Oder andere Methoden, die mir noch nicht bekannt sind
Was ist bei kleinen Datenmengen besser, was bei großen?
Server wird auf Linux laufen und die Clients dazu auf Windows.
Weiters wäre es auch interessant wie man unter Windows am besten Sockets verwaltet (2-3 Verbindungen).
Mit freundlichen Grüßen
posi90
PS.: Fertige Libraries sind unerwünscht.
-
Hi
select kann nur eine bestimmte Maximalanzahl Sockets in einem Aufruf verarbeiten (64 oder so)
Für jede Verbindung einen Prozess machen würde alles nur unnötig verkomplizieren (IPC etc.)
Kombinier select und Threads:
Einen Thread, der für accept da ist.
Dieser reicht seinen Socket an einem anderen Verarbeitungsthread weiter, speichert aber, wie viel Sockets der schon hat. Falls es zu viel werden (64) wird ein zweiter Verarbeitungsthread gestartet, der auch "gefüllt" werden kann. Wenn der auch voll ist, noch ein Thread usw...
Wenn Verbindungen wieder geschlossen werden kann der zuständige Thread ja wieder was neues dafür bekommen, damit er wieder voll ist. Damit nur soviel Threads wie nötig aktiv sind.
Wenn ein Thread leer wird: Beenden.
Und die ganzen Verarbeitungsthreads managen ihre zugeteilten Sockets über select.
Klingt komplizierter, als es zu programmieren ist.
Gruß
-
Hört sich ganz gut an, was ich aber so gelesen hab liegt das limit bei FD_SETSIZE, welches man verändern kann.
Wie ist das mit der Effizienz und der CPU Auslastung mit select()?
Macht das zB. der WOW Server auch so? Oder gibt es da was besseres?
Grüße posi90
-
FD_SETSIZE ändern: Ist nicht so einfach, wie es vielleicht scheint.
Besser lassen, macht weniger Probleme.
CPU-Last von select: Niedrig.
WOW: Keine Ahnung.
-
OK danke!
Da ich das Socket Handling selbst coden will, wollte ich wissen ob es später einmal zu Problemen kommen kann, wenn ein MMO-Game damit ausgestattet wird.
Gruß posi90
-
Ergänzung:
http://tangentsoft.net/wskfaq/articl...trategies.html
Da sind noch einige Möglichkeiten außer select aufgelistet (Threads kann man mit allen kombinieren).
Für Server mit sehr vielen Verbindungen / hohem Datendurchsatz kann es schon Sinn machen, was anderes als select zu nehmen.
Aber alle anderen Methoden schränken die Portabilität Win/Linux etc weiter ein.
Im Link ist eine Tabelle dazu.
Gruß
-
Ich würde dir bei der Anzahl an Verbindungen ganz klar zu IOCP (I/O Completion Ports) unter Windows (ab Win2k verfügbar, wenn mich nicht alles täuscht) oder epoll unter Linux (also Debain & Co) raten.
Es benötigt zwar etwas Einlesezeit und auch Verständniss, aber wenn man es mal drauf hat, ist man froh
Ich bastle im Moment selbst an einer Netzwerk-Lib für ein MMO und fahre damit ganz gut.
-
Super, danke euch beiden, ich lies mich mal da rein, danke für den Tipp =)
Ähnliche Themen
-
'Socket Error #10038 Socket operation on non-socket'
Von jupp2oo8 im Forum C/C++Antworten: 2Letzter Beitrag: 30.01.08, 10:24 -
'Socket Error #10038 Socket operation on non-socket'
Von jupp2oo8 im Forum C/C++Antworten: 2Letzter Beitrag: 29.01.08, 14:59 -
Server Socket und Client Socket
Von spiderman21 im Forum Enterprise Java (JEE, J2EE, Spring & Co.)Antworten: 2Letzter Beitrag: 23.10.07, 17:00 -
Server Socket und Client Socket
Von spiderman21 im Forum NetzwerkeAntworten: 1Letzter Beitrag: 22.10.07, 01:48 -
[C/C++] handling von CR und LF
Von mueslirocker im Forum C/C++Antworten: 4Letzter Beitrag: 08.12.05, 10:17





Zitieren

Login






