Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [C] un server che funziona con un solo client!!

    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?
    Silvia C.

  2. #2

    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.

  3. #3
    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!
    Silvia C.

  4. #4
    Questo e' il loop principale del server..

    codice:
    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 */
        }
    Silvia C.

  5. #5
    Vi prego aiutatemi, sono disperata...
    Silvia C.

  6. #6
    "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".

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.