Visualizzazione dei risultati da 1 a 9 su 9

Discussione: socket & thread

  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    46

    socket & thread

    Ciao, sto cercando di far girare un server TCP concorrente. Appena avvio il processo client il server cade e restituisce qualcosa che non ho mai visto prima.
    codice:
    *** glibc detected *** ./server: free(): invalid size: 0x0804a350 ***
    ======= Backtrace: =========
    /lib/tls/i686/cmov/libc.so.6[0xb7e70a85]
    /lib/tls/i686/cmov/libc.so.6[0xb7e71b5b]
    /lib/tls/i686/cmov/libc.so.6(__libc_calloc+0xcf)[0xb7e729ff]
    /lib/ld-linux.so.2[0xb7f8d628]
    /lib/ld-linux.so.2(_dl_allocate_tls+0xc)[0xb7f8d6ec]
    /lib/tls/i686/cmov/libpthread.so.0(pthread_create+0x4fd)[0xb7f59c3d]
    ./server[0x8048c83]
    /lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe0)[0xb7e1b450]
    ./server[0x80487c1]
    ======= Memory map: ========
    08048000-08049000 r-xp 00000000 08:07 224575     /home/user/Scrivania/prog/server
    08049000-0804a000 rw-p 00000000 08:07 224575     /home/user/Scrivania/prog/server
    0804a000-0808d000 rw-p 0804a000 00:00 0          [heap]
    b7400000-b7421000 rw-p b7400000 00:00 0 
    b7421000-b7500000 ---p b7421000 00:00 0 
    b75e9000-b75f3000 r-xp 00000000 08:07 227648     /lib/libgcc_s.so.1
    b75f3000-b75f4000 rw-p 0000a000 08:07 227648     /lib/libgcc_s.so.1
    b7602000-b7e05000 rw-p b7602000 00:00 0 
    b7e05000-b7f4e000 r-xp 00000000 08:07 245080     /lib/tls/i686/cmov/libc-2.7.so
    b7f4e000-b7f4f000 r--p 00149000 08:07 245080     /lib/tls/i686/cmov/libc-2.7.so
    b7f4f000-b7f51000 rw-p 0014a000 08:07 245080     /lib/tls/i686/cmov/libc-2.7.so
    b7f51000-b7f54000 rw-p b7f51000 00:00 0 
    b7f54000-b7f68000 r-xp 00000000 08:07 245106     /lib/tls/i686/cmov/libpthread-2.7.so
    b7f68000-b7f6a000 rw-p 00013000 08:07 245106     /lib/tls/i686/cmov/libpthread-2.7.so
    b7f6a000-b7f6c000 rw-p b7f6a000 00:00 0 
    b7f79000-b7f7c000 rw-p b7f79000 00:00 0 
    b7f7c000-b7f7d000 r-xp b7f7c000 00:00 0          [vdso]
    b7f7d000-b7f97000 r-xp 00000000 08:07 227603     /lib/ld-2.7.so
    b7f97000-b7f99000 rw-p 00019000 08:07 227603     /lib/ld-2.7.so
    bfb3f000-bfb54000 rw-p bffeb000 00:00 0          [stack]
    Aborted
    Chi mi sa spiegare cosa succede?
    P.S. sono su UBUNTU 8.04

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Bisogna dare un'occhiata al codice del server ....
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    46
    codice:
       pthread_t tid[MAX_CLIENT];
        
       /*CREAZIONE DEL SERVER */
       struct sockaddr_in indirizzo;
       indirizzo.sin_family       = AF_INET;
       indirizzo.sin_port         = htons(5011); 
       indirizzo.sin_addr.s_addr  = htonl(INADDR_ANY);
       
       /*socket di comunicazione*/
       if ((fdserver=socket(AF_INET,SOCK_STREAM,0)) < 0)
       { perror("errore socket"); exit(-1); }
      
       
       
       /*bind*/ 
       if ( bind(fdserver,(struct sockaddr *)&indirizzo,sizeof(indirizzo)) < 0)
       { perror("errore bind"); exit(-1); }
    
       /*Metto il server in ascolto di massimo MAX_CLIENT*/
       if (listen(fdserver,MAX_CLIENT)<0)
       { perror("errore listen"); exit(-1);}
          
       while(1)
       {
          /*Servono per sapere l'indirizzo del client che si è appena collegato*/
          struct sockaddr_in indirizzo_client;
          socklen_t client_size = sizeof(indirizzo_client);
          
          /*accetto la connessione di un nuovo cliente*/
          if ((fdclient=accept(fdserver,(struct sockaddr *)&indirizzo_client,&client_size))<0)
          { perror("errore accept"); exit(-1); }
          
          num++;
          printf("num = %d\n",num_gioc);
          
          /*accettato il client creo un nuovo thread per la gestione concorrente del server*/
          if( (err=pthread_create(&tid[num],NULL,fun,(void *)fdclient))!=0)
          {  printf("errore %s\n",strerror(err));   exit(1);  }
          
          printf("ho creato il thread\n");
       }//fine while

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Nella riga

    if( (err=pthread_create(&tid[num],NULL,fun,(void *)fdclient))!=0)

    utilizzi la variabile num

    che non mi pare sia stata inizializzata in maniera corretta.

    Nella riga

    num++;

    aumenti il valore ma a partire da quanto?

    E perche' in

    printf("num = %d\n",num_gioc);

    utilizzi un'altra variabile, num_gioc ...?

    Dai una controllata attenta al codice ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    46
    Scusami tanto ho cambiato qualcosa prima di incollare ecco perchè c'è la var num_gioc al posto di num.
    questa è la sua inizializzazione: int num=0;

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Ma dov'e' questa inizializzazione ?

    Posta l'esatto codice che ti da' l'errore senza modificarlo altrimenti non si capisce nulla ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    46
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <pthread.h>
    #include <unistd.h>
    #include <string.h>
    #include <time.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <sys/un.h>
    #include <errno.h>
    #include <netinet/ip.h>
    #include <netinet/in.h>
    #include "strutture.h"   //--->questa è una mia libreria testata è funzionante
    
    
    void *fun(void *x)
    {
       char buftime[26];
       int fd = *((int *)x);
       time_t ora;
       time (&ora);
       ctime_r(&ora,buftime);
       
       printf("fdclient = %d\n",fd);
      
      // if ( (write(fd,buftime,26)) <0)
       //{
         // perror("errore write");
          //exit(-1);
       //}
       
       close(fd);
       return NULL;
    }
    
    
    int main(int argc, char *argv[])
    {
       int fdserver,j,err;
       int fdclient;
       int num =0;
     
       struct sockaddr_in indirizzo; //struttura che contiene i dati del server
       
    
    
       /*Alloco lo spazio per alpiù 20 client   */
       pthread_t tid[MAX_CLIENT];
       //----> MAX_CLIENT è una costante in strutture.h 
       
       *CREAZIONE DEL SERVER */
       struct sockaddr_in indirizzo;
       indirizzo.sin_family       = AF_INET;
       indirizzo.sin_port         = htons(5011); 
       indirizzo.sin_addr.s_addr  = htonl(INADDR_ANY);
       
       /*socket di comunicazione*/
       if ((fdserver=socket(AF_INET,SOCK_STREAM,0)) < 0)
       { perror("errore socket"); exit(-1); }
      
       
       
       /*bind*/ 
       if ( bind(fdserver,(struct sockaddr *)&indirizzo,sizeof(indirizzo)) < 0)
       { perror("errore bind"); exit(-1); }
    
       /*Metto il server in ascolto di massimo MAX_CLIENT*/
       if (listen(fdserver,MAX_CLIENT)<0)
       { perror("errore listen"); exit(-1);}
          
       while(1)
       {
          /*Servono per sapere l'indirizzo del client che si è appena collegato*/
          struct sockaddr_in indirizzo_client;
          socklen_t client_size = sizeof(indirizzo_client);
          
          /*accetto la connessione di un nuovo cliente*/
          if ((fdclient=accept(fdserver,(struct sockaddr *)&indirizzo_client,&client_size))<0)
          { perror("errore accept"); exit(-1); }
          
         
          printf("num = %d\n",num); //----->>> CADO QUI
          
          /*accettato il client creo un nuovo thread per la gestione concorrente del server*/
          if( (err=pthread_create(&tid[num],NULL,fun,(void *)fdclient))!=0)
          {  printf("errore %s\n",strerror(err));   exit(1);  } 
       
          num++;
          
          printf("ho creato il thread\n");
       }//fine while 
       
       //-----> Questa parte finale è ancora da sistemare perchè il programma cade prima
       /*aspetto la chiusura di tutti i thread*/
       for (j=0;j<num;j++)
       {
          pthread_join(tid[j],NULL);
          num--;
       }
       printf("finito.\n");
       
       
       
       free(tid);
       close(fdserver);
       exit(0);
    }
    Questo è tutto, a meno di stampe che servono a me per il debugging.
    L'ultima cosa che stampa il server è: num = 0;

  8. #8
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    46
    Questo è il client
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <sys/un.h>
    #include <string.h>
    #include <errno.h>
    #include <unistd.h>
    #include <netinet/ip.h>
    #include <netinet/in.h>
    
    int main (int argc, char *argv[])
    {
      int fd;
      char buffer[26];
      
      struct sockaddr_in indirizzo;
      
      /*inizializzazione della struttura indirizzo*/
      indirizzo.sin_family = AF_INET;
      indirizzo.sin_port   = htons(5011);
      if (inet_aton("127.0.0.1",&indirizzo.sin_addr)==0)
      {
         perror("errore inet_aton");
         exit(-1);
      }
     
     if ( (fd=socket(AF_INET,SOCK_STREAM,0)) <0)
     {
        perror("errore socket");
        exit(-1);
     }
     
     if ( connect(fd,(struct sockaddr *)&indirizzo,sizeof(indirizzo)) < 0)
     {
        perror("errore connect");
        exit(-1);
     }
    
     
     if ( (read(fd,&buffer,26)) < 0 )
     {
        perror("errore read");
        exit(-1);
     }
    
     
     if (  (write(STDOUT_FILENO,&buffer,26)) <0 )
     {
        perror("errore write");
        exit(-1);
     }
     
     write(STDOUT_FILENO,"\n",1);
     close(fd);
     
     exit(0);
    }

  9. #9
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    46
    Non c'è nessuno che può darmi una mano? :master:

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.