Wie verwenden von select() auf sockets richtig?
Ich versuche, wickeln Sie meinen Kopf herum, ruft select
Steckdosen und ich kann nicht verstehen, was ich falsch mache.
setup_server_socket
Anrufe bind
und listen
und legt den socket auf nonblocking-Modus.
Des folgenden code-Blöcken auf der select
nennen, so scheint es, nicht voran zu FD_ISSET
. Ich habe versucht, den Anschluss eines Kunden, und es scheint zu gelingen, aber select
nie wieder etwas.
Was ist der richtige Weg, dies zu tun?
...
int listenfd = setup_server_socket( serverPort );
if( -1 == listenfd )
return 1;
fd_set read_fds;
FD_ZERO(&read_fds);
int fdmax = listenfd;
//loop forever
while( 1 )
{
if (select(fdmax+1, &read_fds, NULL,NULL,NULL) == -1){
perror("select");
exit(4);
}
for (int i = 0; i<= fdmax; i++){
printf("Testing: %d, %d\n", i, FD_ISSET(i,&read_fds));
}return 0;
...
- Aus dem Handbuch:
... If time‐ out is NULL (no timeout), select() can block indefinitely. ...
BTW: -1 return von select() ist kein Fehler - Sicher, aber nur weil Sie KÖNNEN bedeutet nicht, es sollte... das problem ich hatte war, dass FD_ISSET nie wieder etwas, trotz clients angeschlossen sind. Aber es war, weil ich nicht verwenden, FD_SET ersten.
- Auch: Sie muss neu initialisiert werden read_fds jedes mal vor dem Aufruf von select() (wählen Sie ändert die fd_sets ) . Meist geschieht dies durch das kopieren von noch ein fd_set.
- Süße, ich glaube, ich fange an, es jetzt.
- Und, nach ein -1 zurück aus wählen, du solltest überprüfen, errno , vor allem EINTR/EAGAIN/EWOULDBLOCK sollten nicht so behandelt werden, als Fehler.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mehrmals gelesen wählen Sie(2), poll(2) (BTW, sollte man lieber
poll
mit dem veraltetenselect
, die nicht verarbeitet Datei-Deskriptoren, die größer als__FD_SETSIZE
, d.h. 1024 auf meinem Linux - /Debian - /x86-64-system).Dann:
gehen sollte innen die
while(1)
Schleife, bevor Sieselect
. BTW, ich empfehlen die Verwendungpoll
stattselect
Lesen Sie auch über die C10k problem
Vergessen Sie nicht, dass
select
verändert Ihr gegebenfd_set
-s (und in der Regel will, dass Sie nicht leer ist)...Vielleicht verwenden strace(1)
Lesen Sie auch Advanced Linux Programming (es ist ein kostenloses Buch, das konnte man auch Lesen wie auf Papier, oder download von mehreren anderen Orten, z.B. diese etc...)
man
Seiten sorgfältig durch.hier ist man (gekürzt) Beispiel für die Verwendung von select()
Hinweise: