recv: Was ist, wenn die Gegenseite nicht mehr da ist?
-
Hi,
was passiert eigentlich, wenn der Server (im blocking modus) durch recv auf daten vom clienten wartet, dieser aber z.B. einfach den PC abschaltet? Wartet dann Server für immer? Oder kommt irgendwann ein Fehler?
MfG, Herr-Vorragend
-
dann kommt recv() mit 0 (die zahl) zurueck.
es kann auch sein, dass die verbindung vom remote host nicht abgebaut wird (TCP?) und dann hast du pech.
guck dir mal select(), poll() oder WaitForMultipleObjects() an.
-
Mit der Option SO_RCVTIMEO kannst du über setsockopt das Timeout wählen.
-
wah, da kann man timeouts einstellen? da rate ich dir lieber zu select(). da lernste gleich was fuer multiconnection programme.
-
hm, also SO_RCVTIMEO ist nur in Windows verfügbar und in Unix nicht, fällt also schon mal weg.
select() fällt eigentlich auch weg, weil das Programm später mit tausenden von Usern zurecht kommen soll. Also select() selbst kommt ja nicht mit 2.000 Benutzern zurecht und 1 select für jeden Clienten ist denk ich ziemlich Performance-raubend...
-
vielleicht denkst du auch falsch
-
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