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.
Schreibe einen Kommentar