tutorials.de Buch-Aktion 05/2012
Like Tree4Danke
  • 1 Beitrag von sheel
  • 1 Beitrag von sheel
  • 1 Beitrag von sheel
  • 1 Beitrag von _Grubi
ERLEDIGT
JA
ANTWORTEN
7
ZUGRIFFE
272
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    posi90 posi90 ist offline Mitglied Gold
    Registriert seit
    Aug 2010
    Beiträge
    113
    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.
     

  2. #2
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    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ß
    posi90 bedankt sich. 

  3. #3
    posi90 posi90 ist offline Mitglied Gold
    Registriert seit
    Aug 2010
    Beiträge
    113
    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
     

  4. #4
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    FD_SETSIZE ändern: Ist nicht so einfach, wie es vielleicht scheint.
    Besser lassen, macht weniger Probleme.

    CPU-Last von select: Niedrig.

    WOW: Keine Ahnung.
    posi90 bedankt sich. 

  5. #5
    posi90 posi90 ist offline Mitglied Gold
    Registriert seit
    Aug 2010
    Beiträge
    113
    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
     

  6. #6
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    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ß
    posi90 bedankt sich. 

  7. #7
    _Grubi _Grubi ist offline Mitglied Gold
    Registriert seit
    Sep 2009
    Beiträge
    216
    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.
    posi90 bedankt sich. 

  8. #8
    posi90 posi90 ist offline Mitglied Gold
    Registriert seit
    Aug 2010
    Beiträge
    113
    Super, danke euch beiden, ich lies mich mal da rein, danke für den Tipp =)
     

Ähnliche Themen

  1. Antworten: 2
    Letzter Beitrag: 30.01.08, 10:24
  2. Antworten: 2
    Letzter Beitrag: 29.01.08, 14:59
  3. Server Socket und Client Socket
    Von spiderman21 im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 2
    Letzter Beitrag: 23.10.07, 17:00
  4. Server Socket und Client Socket
    Von spiderman21 im Forum Netzwerke
    Antworten: 1
    Letzter Beitrag: 22.10.07, 01:48
  5. [C/C++] handling von CR und LF
    Von mueslirocker im Forum C/C++
    Antworten: 4
    Letzter Beitrag: 08.12.05, 10:17