[C/C++] Socket Handling

posi90

Erfahrenes Mitglied
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/articles/io-strategies.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.
 
Zurück