Bit-für-Bit Vergleich von fd_set



  • Moin!

    Ich versuche gerade 2 Bit Folgen zu vergleichen.

    Der Datentyp ist "fd_set".
    Kann mir jemand sagen wie ich zwei Typen davon Bit für Bit vergleiche?

    Meine Versuche:

    fd_set rpcfd = svc_fdset;
    if(!bcmp(readSet, rpcfd, sizeof(fd_set)))
       continue;
    

    Fehler: Inkompatibler Typ für Argument 1 von »bcmp«
    Fehler: Inkompatibler Typ für Argument 2 von »bcmp«

    rpcfd = svc_fdset;
    if(memcmp(readSet, rpcfd, sizeof(fd_set)) == 0)
       continue;
    

    Der gleiche Fehler.
    Übergebe ich stattdessen eine Referenz darauf, führt er ständig continue aus, obwohl readSet in der "select" Anweisung geändert wurde. Nehme ich die IF-Bedingung raus, so wird weiter ausgeführt und man sieht dann auch, dass readSet verändert wurde.

    Mein kompletter Code sieht wie folgt aus:

    void runSrv()
    {
    	fd_set readSet,rpcfd;
    	struct timeval tval;
    
    	extern int errno;
    	int size = getdtablesize();
    
    	while(1){
    		tval.tv_sec = 5;
    		tval.tv_usec = 0;
    		readSet = svc_fdset;
    
    		switch (select(size + 1, &readSet, (fd_set*) NULL, (fd_set*) NULL,(struct timeval*) &tval))
    		{
    		case -1: // fehler
    			if (errno == EINTR)
    				perror("select fehlgeschlagen\n");
    			return;
    		case 0: // timeout
    			continue;
    		default:
    			rpcfd = svc_fdset;
    			if(memcmp(readSet, rpcfd, sizeof(fd_set)) == 0)
    				continue;
    
    			// weiterer Code, der bei Ungleichheit ausgeführt wird
    		}
    	}// while(1)
    }
    

    Kann mir jemand sagen, wo ich den Fehler mache?

    Gruß Sdy



  • if(memcmp(&readSet, &rpcfd, sizeof(fd_set)) == 0)
       continue;
    

    Aber benutz lieber FD_ISSET oder gleich epoll/libevent.



  • epoll - ich bin froh, dass ich endlich mal die select anweisung einigermaßen gecheckt habe..könntest du mir sonst dazu mal ein beispiel geben?

    ich hänge da jetzt tage dran und pack es einfach nicht!!! 😞

    FD_ISSET überprüft ja nur, ob in dem geänderten readset noch ein anderer filedescriptor ist, oder irre ich mich da?! das ist ja dann nicht die lösung, die ich suche!

    das ganze problem hängt eigentlich damit zusammen, dass ich einen mt rpc server mit tcp in c schreiben möchte, aber das zu vielen komplikationen - vor allem beim aufruf von svc_getreqset() - kommt.


Anmelden zum Antworten