Multithreading RPC Server



  • Moin!

    Es geht um ONC RPC. Ich habe mit dem Programm rpcgen Server und Client Code erzeugt und diesen nach meinen Vorstellungen angepasst.

    Nun bleibt noch eines offen, für das ich irgendwie nichts finde. Mein Vorhaben: Wenn mehrere Clients zum Server connecten und eine bestimmte Funktion aufrufen, soll für jeden Client ein eigener Thread erstellt werden.

    Im netz bin ich auf diese Seite gestoßen:
    http://docs.sun.com/app/docs/doc/816-1435/multirpcp-29838?a=view

    Jedoch gibt es bei mir den Befehl "svc_control" nicht, obwohl ich die "libtirpc"-Pakete habe. Kann mir jemand sagen, was ihc falsch mache? Oder wie ich diese Funktion einbinden kann?

    Gruß
    Sdy



  • 1. Frage hat sich erledigt!

    Nun habe ich jedoch eine andere Frage!

    Auf der Serverseite sind 2 Funktionen.
    1. die Funktion, die vom Client aufgerufen wird und
    2. eine Funktion mit der endung "_freeresult", die folgenden Kommentara beinhaltet:

    /*
    	 * Insert additional freeing code here, if needed
    	 */
    

    Ich allokiere Speicher für ein char-Array in der Remote Procedure. Wie kann ich diesen Speicher in der anderen Funkion wieder freigeben? Oder wird dieser automatisch freigegeben?

    bool_t
    foo_1_svc(REQ *argp, RES *result, struct svc_req *rqstp)
    {
    	printf("SERVER: %s\n", argp->request); // request ist ein char*
    	result->response = (char*)malloc(sizeof(argp->request));
    	strcpy(result->response, argp->request);
    	return(TRUE); // nach diesem return muss ich den Speicher freigeben...
    }
    
    int
    foo_1_freeresult (SVCXPRT *transp, xdrproc_t xdr_result, caddr_t result)
    {
    	xdr_free (xdr_result, result);
    // ...also hier, da diese funktion danach aufgerufen wird. Aber wie komme ich an den Speicher?
    
    	/*
    	 * Insert additional freeing code here, if needed
    	 */
    
    	return 1;
    }
    

    Gruß
    Sdy



  • Moin!

    Ich öffne einen Socket auf Server Seite, um Verbindungswünsche entgegen zu nehmen. Daraufhin gehe ich in eine Endlosschleife mit einer select-Anweisung.
    Sobald select etwas gefunden hat, soll ein neuer Thread mit dem Request Socket des Clients gestartet werden. Im Thread soll dann der Request ausgelesen werden und verarbeitet werden. Jedoch bricht er bei svc_getreqset() ab.
    Ich denke, da ist ein fehler mit dem fd_set, aber ich weiß einfach nicht, wo er liegt. 😕

    while(1){
    		tval.tv_sec = 5; 
    		tval.tv_usec = 0;
    		fd_set readSet = svc_fdset; 
    
    		resSelect = select(size+1, &readSet, (fd_set*)NULL, (fd_set*)NULL, (struct timeval*)&tval);
    
    		if(resSelect == -1 && errno == EINTR) // fehler
    			continue;
    		if(resSelect == 0) // timeout
    			continue;
    
    		if(FD_ISSET(srvSocket, &readSet)){
    			FD_CLR(srvSocket, &readSet);
    			int clntSocket = accept(srvSocket, (struct sockaddr*)&addr, &addrlen);
    			if(clntSocket != -1){
    				pthread_create(&clientthread, NULL, threadfnc, (void*)clntSocket);
    			}
    		}
    	}
    
    void* threadfnc(void* args)
    {
    	pthread_detach(pthread_self());
    	int s = (int)args;
    	fd_set cconnect;
    	FD_ZERO(&cconnect);
    
    	FD_SET(s, &cconnect);
    	printf("threadfnc\n");
    
    	svc_getreqset(&cconnect);
            /* wird nicht erreicht, im moment aber egal */
    	int res = close((int)args);
    	if(!res)
    		printf("Socket erfolgreich geschlossen\n");
    
    	return NULL;
    }
    

    Vielleicht bin ich auch in die völlig falsche Richtung gelaufen.
    Gruß
    Sdy



  • Nach kurzem Ueberfliegen Deines Codes wuerde ich annehmen, dass es z.B. sinnvoller waere erst die Verbindung zu akzeptieren, bevor ich darauf warte, dass auf dem Socket was passiert.
    Also wuerde ich im Hauptthread accept() verwenden, dann forken bzw. nen child-thread erzeugen, in dem ich mit select darauf warte, dass was auf dem mitgegeben Socket passiert



  • Aber dann wird ja pro request ein thread gestartet. Dann könnte ich wieder getreqset() in die Abfragen mitreinziehen. Aber soll pro Connect bzw. pro Client ein Thread gestartet werden.

    Weißt du wo ich da den Fehler habe?!


Anmelden zum Antworten