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