PDA

Visualizza la versione completa : [C] un server che funziona con un solo client!!


sparkling
18-10-2007, 14:50
Vi prego di aiutarmi perche' sul mio progetto che devo fare in C per l'universita' ci sto smattando ormai da molto... ci sono dei problemi che non riesco a risolvere, non so dove sbattere la testa!!!!!!
Allora, in primis una cosa che non capisco... la mia applicazione e' client/server ma non funziona! O meglio, finche' e' un client solo, qualche speranza c'e' che qualcosa funzioni, ma con piu di uno proprio no, si blocca, anzi, mi da un errore sulla pipe (No such file or directory).
L'applicazione in se e' semplicissima.. un server gestisce una serie di matrici e il client non e' che un interfaccia verso l'utente.. l'utente puo' chiedere di creare una matrice, fare operazioni su matrici ecc.. . Quello che proprio non capisco e' perche' mi da errore sulla pipe e non solo quando ci sono piu client ma addirittura a volte me lo fa all'inizio non appena avvio il client. Da cosa puo' dipendere un problema simile?

pallinopinco
18-10-2007, 15:01
Da cosa puo' dipendere un problema simile?

Puņ dipendere da una miriade di cause diverse... Č come se dicessi "la mia auto non funziona, da cosa puņ dipendere?".

Senza vedere cosa hai scritto č impossibile rispondere a questa domanda.

sparkling
18-10-2007, 15:21
Prima di postarvi del codice volevo sapere se era un caso plateale magari molto conosciuto e di cui io non ero a conoscenza... il codice e' lunghissimo, non sapendo dove puo' essere il problema non so cosa postare... cmq ora provo a farvi capire postando qualcosa!

sparkling
18-10-2007, 15:33
Questo e' il loop principale del server..


while (TRUE)
{

/* leggo dalla pipe con id fifo aperta in precedenza*/
while((letto = read(fifo,msg,MAXDIM)) > 0)
{

printf("RICEZIONE --> %s\n",msg);
if(strstr(msg,"CONNECT")!= NULL)
{
if((sscanf(msg,"%d CONNECT %s",&p,&nome_u))== 2)
{

if(chdir("..")== -1)
{
perror("Nella chdir");
exit(errno);
}

/* apro la pipe serverclientPID per spedire la risposta positiva al client */
sprintf(serverclient,"serverclient%d%c",p,SZ);
fifo_client = apri_pipe(serverclient,O_RDWR);


/* mi risposto dentro nmat_data */
if(chdir("./nmat_data")== -1)
{
perror("Nella chdir");
exit(errno);
}


/* controlla che l'utente che ha fatto richiesta di connessione non sia gia' connesso */
if((autorizzazione(&nome_u,users_list)== 0)||(controllo_accessi(&nome_u) == 0))
{
/* connessione non accettata */
fprintf(stderr,"Impossibile connettersi.\n** Utente non riconosciuto oppure gia' connesso **\n");
sprintf(ok,"%d KO%c",getpid(),SZ);
write(fifo_client,&ok,30);
/* se non ci sono gia' mi sposto nella directory principale */
if(chdir("..")== -1)
{
perror("Nella chdir");
exit(errno);
}

fclose(users_list);
close(fifo);
close(fifo_client);
unlink("clientserver");


exit(-1);
}
}

}


/* connessione accettata */



/* mi sposto nella directory principale */
if(chdir("..")== -1)
{
perror("Nella chdir");
exit(errno);
}

/* mando la risposta di ok al client per avvertire dell'avvenuta connessione */
sprintf(ok,"%d OK%c",getpid(),SZ);
write(fifo_client,&ok,30);
printf("OK:: %s\n",ok);

if((pid = fork()) == -1)
{
perror("Nella fork()\n");
exit(errno);
}

else if (pid == 0)
{

/* creazione della pipe clientserverpid */
sprintf(clientserver,"clientserver%d%c",p,SZ);
crea_pipe(clientserver);

/* apertura della pipe clientserverpid */
fifo_fi = apri_pipe(clientserver,O_RDONLY);


/* leggo dalla pipe il messaggio in arrivo */
while((letto = read(fifo_fi,&cosafare,MAXDIM)) > 0)
{
cosafare[letto] = SZ;

/* codice identifica un'operazione. A seconda del numero eseguo diversi comandi.
Ometto il tutto, ho gia' testato che non ha niente a che vedere col problema... */


codice = estrai_codice(cosafare);

if(codice == 1)
{

}

if (codice == 2)
{

}

if (codice == 3)
{

}

if (codice == 4)
{

}

if (codice == 6)
{

}
}

}
else
{
waitpid(pid,&status,0);
if (WIFEXITED(status))
printf("Utente %s terminato:: %d\n",&nome_u,WEXITSTATUS(status));
}
}

/* break;*/

/* FINE WHILE */
}

sparkling
18-10-2007, 16:13
Vi prego aiutatemi, sono disperata... :(

MacApp
18-10-2007, 18:42
"Posta" qualcosa di compilabile, magari specificando anche con quale sistema operativo e compilatore stai sviluppando.
A prima vista il ciclo sembra un po' troppo lunghetto.
Considera anche che se le funzioni "autorizzazione" e "controllo_accessi" hanno effetti collaterali, allora molto probabilmente l'uso che ne fai genera un classico "undefined behavior".

Loading