PDA

Visualizza la versione completa : socket & thread


KITT
07-06-2008, 15:50
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.


*** 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

oregon
07-06-2008, 15:53
Bisogna dare un'occhiata al codice del server ....

KITT
07-06-2008, 16:00
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

oregon
07-06-2008, 16:06
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 ...

KITT
07-06-2008, 16:15
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;

oregon
07-06-2008, 16:17
Ma dov'e' questa inizializzazione ?

Posta l'esatto codice che ti da' l'errore senza modificarlo altrimenti non si capisce nulla ...

KITT
07-06-2008, 16:36
#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;

KITT
07-06-2008, 16:38
Questo il client


#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);
}

KITT
08-06-2008, 11:31
Non c' nessuno che pu darmi una mano? :master:

Loading