Problem mit Socket: "Select"
-
Hallo,
hier mal ein Codeausschnitt.
Warum wird das "OK" nicht an beide Clients geschickt, sondern immer nur an einen? siehe ab Zeile 27
Vielen dankfd_set ready2read; FD_ZERO (&ready2read); FD_SET (td[0], &ready2read); FD_SET (td[1], &ready2read); n = (td[0] > td[1] ? td[0] : td[1]) + 1; rc = select(n, &ready2read, NULL, NULL, NULL); if (rc < 0) { perror("\nselect"); exit (1); } if (rc == 0) printf("End of File\n"); /* Ok Senden - Bestätigung Kontaktaufnahme */ rc = write(td[0], "OK\n", 3); if (rc < 0) { perror ("write"); exit (1); } rc = write(td[1], "OK\n", 3); if (rc < 0) { perror("write"); exit(1); } /* Name Client#1 - OK senden */ if (FD_ISSET (td[0], &ready2read)) { rc0 = read (td[0], buffer0, MAXLEN); if (rc0 < 0) { perror ("read"); exit (1); } if (rc0 == 0) exit(1); quit(buffer0,rc0,td); write(td[0], "OK\n", 3); } /* Name Client#2 - OK senden */ if (FD_ISSET (td[1], &ready2read)) { rc1 = read (td[1], buffer1, MAXLEN); if (rc1 < 0) { perror ("read"); exit (1); } if (rc1 == 0) exit(1); quit(buffer1,rc1,td); write (td[1], "OK\n", 3); } /* Beide Namen wurden übergeben */ if (rc0 > 0 && rc1 > 0) { /** Sende Name Client#2 an Client#1 **/ rc = write(td[0], buffer1, rc1); if (rc < 0) { perror("write"); exit(1); } /** Sende Name Client#1 an Client#2 **/ rc = write(td[1], buffer0, rc0); if (rc < 0) { perror("write"); exit(1); } /** OK Client#1 **/ if (FD_ISSET (td[0], &ready2read)) { rc0 = read(td[0], buffer0, MAXLEN); if (rc0 < 0) { perror("read"); exit(1); } if (rc0 == 0) exit(1); quit(buffer0,rc0,td); } /** OK Client#1 **/ if (FD_ISSET (td[1], &ready2read)) { rc1 = read(td[1], buffer1, MAXLEN); if (rc1 < 0) { perror("read"); exit(1); } if (rc1 == 0) exit(1); quit(buffer1,rc1,td); } }
Grüße
-
Es müssen nicht alle Sockets im Set lesbar sein, select() returned schon bei nur einem lesbaren Socket.
Aber alle nicht-lesbaren Sockets schmeißt select() aus dem Set.
Man kann also anschließend mit dem FD_ISSET-Makro prüfen welche Socket lesbar sind.
-
habe das ja mit FD_ISSET überprüft! Aber gebe ich dann am Client "OK" ein, kann ich dies beim zweiten Client nicht mehr, da das Programm schon sozusagen weiterläuft...