PDA

Visualizza la versione completa : [C] Server che non visualizza nulla e non risponde ai client


Nitro_Insane
18-01-2011, 19:02
Buonasera, ho implementato un server che funge da rubrica telefonica, ad ogni riciesta da parte dei client di inserire o leggere una voce dalla rubrica lui dovrebbe rispondere..
l'ho compilato con 0 errori di sintatssi, giusto qualche warning!
ho anche inserito qualche stampa di controllo nel codice..
MA se mbra che il server sia morto perchè nn genera stampe a video e non comunica col client; anche se devo dire che il client nn dà errori quando si connette al server da cui dovrei dedurre che sono collegati..

posto il codice del server senza il thread che genera, vi chiedo di dirmi per quale motivo il server è per modo di dire "addormentato". GRAZIE



#include <pthread.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <errno.h>

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <string.h>



#define SERV_PORT 3092 /*porta del server*/

#define BACKLOG 10 /*lunghezza max delle connessioni in arrivo*/

#define MAXLINE 1024 /*lunghezza del buffer di lettura/scrittura*/

#define MAXN 16384 /*numero max di bytes*/



struct elemrubrica

{

char nome[50];

char cognome[50];

char numtel[50];

};





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

{

void *rubrica(void *); /*prototipo del run del thread*/



int connectsock, listensock, n; /*socket di connessione, socket di ascolto,

*e variabile per memorizzare l'id del

*thread*/



pthread_t tid; /*variabile che rappresenterà il futuro thread*/



struct sockaddr_in serveraddr; /*struttura che rappresenta gli indirizzi

*per la comunicazione*/

printf("1");

/*controllo sull'assegnazione della socket*/

if((listensock = socket(AF_INET, SOCK_STREAM, 0)) < 0)

{

fprintf(stderr, "socket error\n");

exit(1);

}



memset((void*)&serveraddr,0,sizeof(serveraddr)); /*azzero la struttura*/

serveraddr.sin_family=AF_INET; /*definisce il protocollo TCP*/

serveraddr.sin_port=htons(SERV_PORT);

serveraddr.sin_addr.s_addr=htonl(INADDR_ANY);

printf("2");

/*attribuisce l'indirizzo locale della macchina*/

if((bind(listensock,(struct sockaddr *)&serveraddr,sizeof(serveraddr))) < 0)

{

fprintf(stderr, "bind error\n");

exit(1);

}

printf("3");

/*controllo sull'ascolto*/

if(listen(listensock, BACKLOG) < 0 )

{

fprintf(stderr, "listen error\n");

exit(1);

}



/*ciclo infinito*/

while(1)

{

printf("in attessa di connessioni");

/*controllo sull'accettazione della connessione*/

if((connectsock=accept(listensock,NULL,NULL)) < 0)

{

fprintf(stderr, "accept error\n");

exit(1);

}



/*controllo sulla creazione del thread*/

if((n=pthread_create(&tid,NULL,&rubrica, (void *)connectsock)) != 0)

{

fprintf(stderr, "pthread_create error\n");

exit(1);

}

printf("connessione accettata e thread creato");

}

}

Celebron
19-01-2011, 03:20
puoi elencare i warning?
Per la cronaca, ho imparato a mie spese e col tempo che, prima di testare un programma, il compilatore non dovrebbe restituire nemmeno un warning. Sono spesso e volentieri errori logici ben precisi

Nitro_Insane
19-01-2011, 11:58
server.c: In function ‘main’:
server.c:76: warning: cast to pointer from integer of different size
server.c: In function ‘rubrica’:
server.c:125: warning: cast from pointer to integer of different size
server.c:133: warning: cast from pointer to integer of different size
server.c:137: warning: cast from pointer to integer of different size
server.c: In function ‘estrazione’:
server.c:173: warning: format ‘%s’ expects type ‘char *’, but argument 3 has type ‘char (*)[50]’
server.c:173: warning: format ‘%s’ expects type ‘char *’, but argument 4 has type ‘char (*)[50]’
server.c:173: warning: format ‘%s’ expects type ‘char *’, but argument 5 has type ‘char (*)[50]’


non capisco xke confronto il codice con quello di amici a loro gira a me no!

Nitro_Insane
19-01-2011, 12:02
questo è il thread che apre magari può aiutarvi a capire..



void *rubrica(void * connectsock)

{

/*prototipi di funzioni per il thread safety*/

ssize_t readn(int fd, void *buf, size_t n);

ssize_t writen(int fd, const void *buf, size_t n);

ssize_t readline(int fd, void *vptr, size_t maxlen);



struct elemrubrica app_elemrubrica;



/*prototipi di funzioni*/

void estrazione(int connectsock, FILE * fp, struct elemrubrica app);

void inserimento(int connectsock, FILE * fp, struct elemrubrica app);



int risp; /*conterrà il valore convertito in intero della

*risposta del client*/

int n;

ssize_t nread;



char buffer[MAXLINE]; /*buffer di lettura/scrittura*/



/*controllo sul detaching del thread*/

if((n = pthread_detach(pthread_self())) != 0)

{

errno = 0;

fprintf(stderr, "pthread_detach error");

exit(1);

}



FILE * fp;

/*controllo sull'apertura del file*/

if((fp=fopen("prova.txt","r"))==NULL)

{

fprintf(stderr, "error opening file");

exit(1);

}





do

{

/*lettura della scelta dell'operazione dal client*/

if((nread=readline((int)connectsock,(void *)buffer,MAXLINE)) == 0)

return; /* connessione chiusa dal client */



risp=atoi(buffer);



switch(risp)

{

case 1:

estrazione((int)connectsock, fp, app_elemrubrica);

break;



case 2:

inserimento((int)connectsock, fp, app_elemrubrica);

break;



case 0:

/*uscita*/

break;



default:

/*tutti gli altri casi*/

break;

}

}while(risp != 0);



fclose(fp);

}

kirakira93
19-01-2011, 17:21
io di socket ci capisco poco perché preferisco usare winhttp e wininet, ma non dovresti specificare l'url del server, sennò i socket anche se specifichi la porta mica se li inventa!

Nitro_Insane
19-01-2011, 17:39
nono nn c'è quel problema il client si collega al server ho già testato!

cmq su ubuntu 10.10 il client nn dà errori.. l'ho provato con putty sul server dell'uni invece mi dà un SEGMENTATION FAULT.. mmmm

Loading