POSIX Selects FD_SET und FD_CLR
-
Ich hab mal ne Frage zu folgendem Text aus den Man-Pages.
Man-Page schrieb:
An fd_set is a fixed size buffer. Executing FD_CLR or FD_SET with a
value of fd that is negative or is equal to or larger than FD_SETSIZE
will result in undefined behavior. [...]FD_SETSIZE ist bei mir 1024. Was ist jetzt, wenn ich 1025 Sockets offen hab? Dann müsste doch mein fd > 1024 sein. Kann ich das Socket dann nicht mehr in das fd_set packen oder kann ich nicht mehr als 1024 FPs öffnen?
-
Das bedeutet nur, dass du kein Socket übergeben solltest, dessen handle größer als FD_SETSIZE ist. Aber es würde mich auch wundern, wenn du je in die Situation kommst.
Naja, select ist ja eh nicht so ideal.
-
kingruedi schrieb:
Aber es würde mich auch wundern, wenn du je in die Situation kommst.
Würd mich auch ein wenig wundern. Wobei es ja nich ausgeschlossen ist, dass ich mal 1025 Sockets gleichzeitig behandeln muss
kingruedi schrieb:
Naja, select ist ja eh nicht so ideal.
Was sind denn die alternativen? Man kann ja nich für jede Verbindung nen Thread oder schlimmer nen ganzen Prozess starten... Man könnte natürlich alle 1024 Sockets nen neuen Prozess starten.
Aber mir ist mit der Antword schon geholfen, dass ich weis, dass ich überprüfen muss, dass mein fd nich größer als 1024 wird, weil ich es nicht ausschließen kann.
Danke
-
epoll
-
stichwort schrieb:
epoll
Man-Page schrieb:
CONFORMING TO
epoll(4) is a new API introduced in Linux kernel 2.5.44. Its interface
should be finalized in Linux kernel 2.5.66.Das hört sich nicht so an, als wäre es sehr portabel... Ich hätte gerne ne Lösung, die ich nicht für jedes Betriebssystem neu schreiben muss (das ist ja auch das nette an *NIX), aber epoll kann man sicher als Optionales Feature anbieten.
-
Benutz einfach so etwas wie libevent oder enot. Die kümmern sich um die platform spezifischen hacks.
-
kingruedi schrieb:
Benutz einfach so etwas wie libevent oder enot. Die kümmern sich um die platform spezifischen hacks.
Das klingt schon gut.
Danke
Falls ich mal vor hab, mehr als 1024 Clients zu versorgen, werd ich drauf zurück kommen