PDA

View Full Version : [C] Aiuto Controllo Codice - Thread status NULL


ginter87
23-01-2010, 20:29
Innanzitutto vi allego il codice server. Ho un pò di problemi perche durante l'esecuzione dovrebbe in teoria permettermi di caricare l'array di stringhe, poi creare il socket e mettersi ina attesa di connessione

solo che si ferma al thread che non m fa caricare nemmeno l'arry ... e termina con status null



#include <stdio.h> // per I/O

#include <stdlib.h> // per exit, malloc, atoi...

#include <unistd.h> // per exec, getpid...

#include <pthread.h> // thread

#include <semaphore.h> //semafori posix

#include <sys/types.h> // standard posix
#include <netinet/in.h>

#include <sys/socket.h> // socket

#include <signal.h> // segnali

#include <string.h>
#include <pthread.h>
#include "common.h"

#define totpost 20

#define MAX 10 //numero domande
#define LEN 1023 //caratteri per riga: 1023+0\


char domande[MAX][LEN+1]; //tabella caricata con domande e risposte

void *caricamento(void *arg); //funzione svolta dal thread1

int sd,i ;
int tab[totpost][2];
struct sockaddr_in server_addr; // struttura dati di configurazione

struct sockaddr_in client_addr;

socklen_t client_len;



int main(int argc, char *argv[])

{

printf("Server avviato con pid = %d\n", getpid());

int i;
//THREAD
int res;
pthread_t thread1; //primo thread per il caricamento
void * thread_result;
res=pthread_create(&thread1, NULL, caricamento,NULL);
if (res!=0)
{ perror("\n****ERRORE CREAZIONE THREAD***\n");
exit(1);
}
printf("Aspetto che il caricamento sia completato...\n");
res=pthread_join(&thread1, &thread_result); //come la wait

printf("thread1 terminato con stato: %s\n", (char*) thread_result);
exit(EXIT_SUCCESS);


//SOCKET
int client_sd[totpost];

// preparazione dei dati relativi al bind

server_addr.sin_family = AF_INET;

server_addr.sin_port = htons(PORT); //host to network

server_addr.sin_addr.s_addr = INADDR_ANY;

client_len = sizeof(struct sockaddr_in);


int sd=socket(AF_INET, SOCK_STREAM, 0);//restituisce l'identificativo del socket
if(sd<0)
{
perror("creazione socket errata!!\n");
exit(-1);
}
printf("Effettuo la bind del socket con la porta ds\n", PORT);

if (bind(sd, (const struct sockaddr *) &server_addr, client_len) < 0)

{

perror("Durante il bind\n");

exit(1);

}



printf("Mi metto in attesa di connessioni sulla porta %d\n", PORT);

if (listen(sd, 20) < 0) //max 20 client

{

perror("Durante il listen");

exit(1);

}



printf("Entro nel ciclo infinito in cui accetto connessioni\n");



while (1)

{
// itero il tutto cn un ciclo for ke crea un sd dedicato per ogni client accettato
for(i=0;i<totpost;i++)
{
pid_t pid = fork();

if (pid == 0)
{
printf("sono il servente: %d\n",getpid()); //figlio ke s collega con il client
client_sd[i] = accept(sd, (struct sockaddr *) &client_addr, &client_len);
if (client_sd[i] < 0)
{
perror("Durante l'accept\n");
exit(1);
}
//close(sd);
printf("Connessione con client accettata sul socket %d\n", client_sd[i]);

tab[i][0]=getpid();
tab[i][1]=client_sd[i];
}
else
{
printf("\n\n ERRORE FORK\n\n");
exit(1);
}
}

//manca una grossa parte di codice ke riguarda la gestione delle send e delle receive e del confronto
//printf("Chiudo il socket %d dedicato con il client\n", client_sd[i]);

//close(client_sd[i]);
//exit(0);
}
}


void *caricamento(void *args) //thread1 caricamento domande
{
char s[1024];
int k;
int risp;
for(k=0; k<MAX; k++)
{
do{
printf("Inserisci la %d domanda e le 4 risposte\t \n", i+1);
gets(s);
if(strlen(s)==0)
{
printf("ERRORE: STRINGA VUOTA!! REINSERIRE DATI.");
k--;
}
else if(strlen(s)>LEN)
{
printf("ERRORE: STRINGA TROPPO GRANDE!! REINSERIRE DATI.");
k--;
}
printf("Sei sicuro di voler salvare le domande? Se si premi 1 altrimenti premi 0\n");
scanf("%d", &risp);
}while(risp==0);
strcpy(domande[k], s);
}

sleep(30);

}


IGNORATE gli sleep ... li ho messi a caso


perciò. dove sbaglio????