recv: Was ist, wenn die Gegenseite nicht mehr da ist?
-
poll()
oder
WaitForMultipleObjects()nimm nen preprocessor wenn du "plattformunabhaengig" sein willst
select() hat seine grenzen, deswegen die beiden da oben
select() sowie die beiden funktionen da oben wendet man auf mehrere sockets an, nicht auf einen.
-
select() sowie die beiden funktionen da oben wendet man auf mehrere sockets an, nicht auf einen.
So ein Quatsch. Man macht es immer so wie man es braucht.
-
klugscheisser wie du haben hier nichts verloren. geh woanders trollen.
und damit mich nicht noch jemand anders falsch versteht, die funktionen fressen auch einzelne sockets.
genaueres steht in den man pages oder der MSDN (sowas lern ich doch nicht auswendig).
-
-
Hm, also ich weiß jetzt immernoch nicht so recht was ich machen soll. Also mein Programm sieht so aus:
Es gibt eine "Hauptschleife", die per accept immerwieder neue clienten annimmt. Für diesen wird dann ein eigener Thread erstellt und dort wartet er wieder in einer schleife mit recv. Das funktioniert auch wunderbar (auch mit 2.000 benutzern), allerdings weiß ich jetzt nicht, wie ich da ein timeout noch einbauen soll...
-
was auch immer du da vorhast, ueberlege, ob es nicht doch als singlethreaded funktionieren wuerde. im ernst, 2000 threads sind schon irgednwie overkill. ich hab im ganzen system 500 threads und dabei ist meine kiste schon schwer am multitasken.
ein einzelner select() loop ist doch garnicht so schlecht. nur musst du dann die statusinformationen zu jedem clienten irgendwo speichern und bei ein/ausgehenden daten entsprechende funktionen damit beauftragen.
-
c.rackwitz wie macht man denn select auf mehr als 64 sockets?
-
(1) vor dem includen der entsprechenden header die groesse der fdsets mittels eines defines aendern (man select ist die autoritaet)
(2) die sockets ueber mehrere selects aufteilen (schlechte idee)
(3) poll() benutzen (OS abhaengig)
(4) WaitForMultipleObjects() benutzen (OS abhaengig, kann auch anders heissen)
-
c.rackwitz schrieb:
(1) vor dem includen der entsprechenden header die groesse der fdsets mittels eines defines aendern (man select ist die autoritaet)
Du weisst aber schon, dass FD_SETSIZE vom System festgelegt wird, oder?
-
The default size of FD_SETSIZE is currently 1024. In order to accommo-
date programs which might potentially use a larger number of open files
with select(), it is possible to increase this size by having the program
define FD_SETSIZE before the inclusion of any header which includes
<sys/types.h>.ich weiss ja nicht, wie das auf anderen systemen ist aber in dem fall wuerd ich mich einfach mal mit der doku zum system hinsetzen und die lesen...
jetzt mal im ernst. war dir einfach nicht danach, selber mal nach antworten zu suchen?
-
c.rackwitz schrieb:
jetzt mal im ernst. war dir einfach nicht danach, selber mal nach antworten zu suchen?
Hab ich gemacht. In Posix steht nichts dazu, also muss es wohl 'ne unportable Erweiterung von FreeBSD sein.
-
da sockets nicht zu ANSI C gehoeren, stellt sich mir die frage nach "plattformunabhaengiger programmierung" nicht mehr. allein die socketheader fuer unix und windows sind verschieden. da machts auch nichts weiter aus, sich auf select(), poll() oder WaitForMultipleShit() festzulegen, wenn man sowieso auf an gewisse plattformen gebunden ist.
-
epoll
-
aio
-
Also mit der Platform ist das so ne Sache, wär schon schön wenn es auf Unix und Windows laufen würde, weil ich untern Windows entwickele und das Programm später auf dem Server unter Unix laufen soll.
Also FD_SETSIZE ist bei mir auch auf 64 festgelegt. Kann ich es denn einfach größer definieren?
Und also irgendwie find ich mein Konzept gar nicht mal soo dumm. Bei 2.000 Usern gibt es unter Windows kein Problem. Das Programm belegt dann ca. 20 MB Speicher. Ist das eurer Meinung nach zu viel? Hab mir überlegt, dass ich das Programm dann später einfach mehrfach über verschiedene Ports laufen lasse, sodass ich dann auch mit 10.000 Usern problemlos zurech komme.
Oder sind diese Werte schlecht bzw. verbesserbar?
-
-
ja das mit den 2.000 Threads als Grenze ist mir auch aufgefallen. Allerdings hilft mir folgendes auch nicht weiter:
HANDLE h = CreateThread(NULL, 4096, ThreadProc, NULL,
STACK_SIZE_PARAM_IS_A_RESERVATION, &id);da ich nicht in der WinAPI programmiere (sondern mit pthread, was eben auf Windows _und_ Unix läuft).
-
Hast du schon mit 2000 Clients getestet?
-
ja und es funktioniert
-
ich flehe dich an, nimm select(), poll() oder waitformultipleshit(). kapsele es wenn noetig und mach preprocessor directives drum herum fuer bedingte compilierung.
aber um gottes willen benutz keine 2000 threads. das ist overkill.