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 dank

    fd_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...


Anmelden zum Antworten