Salve, sto cercando di fare un server client che faccia semplicemente giocare da client tramite i dati sul server, per lo più è tutto write da server e read da client, pero' mi fa un errore strano che non capisco, mi spiace darvi da leggere 1 codice cosi' lungo ma alla fine è abbastanza banale e di facile comprensione.
la variabile int fine, presente nella funzione impiccato, da server vale 0 nei primi cicli (e cosi' deve valere), il client, non capisco perchè, legge i 4 byte del tipo intero, ma, il valore dell'intero fine non è 0, bensi un numero strano, che cambia, Es. 112301412 o altri.
Nel programma ho messo la lettura da server perchè da client non riusciva, se qualcuno mi scrivesse come farla glie ne sarei grato (testando pero')
P.s. Programma scritto e provato su Mandriva 2010
P.p.s C'è qualche errore anche nelle write del server perchè alla prima iterazione del while funzionano bene le stampe lato client, dalla seconda arrivano scritte parziali.
Server
Clientcodice:#include <sys/types.h> /*libreria per i tipi non primitivi (pid_t) */ #include <unistd.h> /* libreria read, write, close */ #include <arpa/inet.h> /* liberia per gli IP */ #include <sys/socket.h> /* librearia socket */ #include <stdio.h> /* libreria sugli I/O */ #include <stdlib.h> /* libreria exit, atoi */ #include <string.h> /* libreria stringhe */ #include <time.h> /* libreria tempo seed */ #include <errno.h> /* libreria errori */ #define CONNESSIONI_MAX 8 #define PORTA 54321 int Socket (int famiglia, int tipo, int protocollo); void Bind (int descrittoreSocket, const struct sockaddr * indirizzo, socklen_t len_indirizzo); void Listen (int descrittoreSocket, int lunghezza_coda); void impiccato(int da); int main(int argc, char *argv[]) { int descrittoreSocket, descrittoreAccept; struct sockaddr_in server, client; pid_t pid; socklen_t len; int risposta, nread, nwrite; char nickname[33]; descrittoreSocket=Socket(AF_INET, SOCK_STREAM, 0); server.sin_family = AF_INET; server.sin_addr.s_addr = htonl(INADDR_ANY); server.sin_port = htons(PORTA); Bind(descrittoreSocket, (struct sockaddr *) &server, sizeof(server)); Listen(descrittoreSocket, CONNESSIONI_MAX); printf("Server up!!!!\n"); while(1) { len = sizeof(client); if ((descrittoreAccept=accept(descrittoreSocket, (struct sockaddr *) &client, &len)) < 0) { perror("Accept"); exit(1); } if ((pid = fork()) < 0) { perror("Fork"); exit(1); } if (pid == 0) /* Siamo nel figlio */ { close(descrittoreSocket); nread=read(descrittoreAccept, nickname, 32); if (nread < 0) exit(1); printf("Connessione da parte di 1 client, nome %s, porta %d\n", nickname, ntohs(client.sin_port)); nread = read(descrittoreAccept, &risposta, sizeof(int)); if (nread < 0) exit(1); printf("%d\n",risposta); switch (risposta) { case 1: { printf("scelta 1"); // tris(descrittoreAccept) da implmenetare close(descrittoreAccept); exit(1); break; } case 2: { printf("scelta 2"); impiccato(descrittoreAccept); close(descrittoreAccept); exit(1); break; } case 3: { printf("scelta 3"); close(descrittoreAccept); exit(1); break; } } close(descrittoreAccept); exit(0); } } close(descrittoreAccept); close(descrittoreSocket); exit(0); } int Socket (int famiglia, int tipo, int protocollo) { int n; if (( n = socket(famiglia, tipo, protocollo)) < 0) { perror("Socket"); exit(1); } return (n); } void Bind (int descrittoreSocket, const struct sockaddr * indirizzo, socklen_t len_indirizzo) { if (( bind (descrittoreSocket, indirizzo, len_indirizzo) < 0)) { perror("Bind"); exit(1); } } void Listen (int descrittoreSocket, int lunghezza_coda) { if ( listen (descrittoreSocket, lunghezza_coda) < 0) { perror("Listen"); exit(1); } } void omino (int errori, int da); void impiccato(int da) { char *array[]={"cassa","connessione","calciatore","cruciverba","cremonese", "camper"}; short len_parola, n, i, mancanti; short ok=0, errori=0; //Ok server per vedere se un if e' stato usato short parole=6, vite=6; char parola_temp[20]; //Parola temporanea contenente la soluzione parziale char *lettera; //La lettera scelta dall'utente char *soluzione; //Gli sara' copiata la soluzione, estraendola dall'array char megabuffer[512]; char occorrenza[20]; int fine=0, nread; lettera=(char *)malloc(1*sizeof(char)); //Allocazione dinamica srand((unsigned int)time(0)); //Numeri casuali seed n= rand()%parole; //Numeri tra 0 e 5 len_parola=strlen(array[n]); //Salvataggio lunghezza parola scelta mancanti=len_parola; //Mancano da scoprire quindi len_parola lettere soluzione=array[n]; //Salvataggio soluzione for (i=0; i<len_parola; i++) //Inizializza a _ _ _ _ _ _ parola_temp[i]='_'; while (1) //Ciclo infinito { // printf("\nStato della parola: \n"); sprintf(megabuffer,"\nStato della parola: \n"); for (i=0; i<len_parola; i++) //Stampa la parola parzialmente indovinata { // printf("%c", parola_temp[i]); sprintf(occorrenza, "%c", parola_temp[i]); strcat(megabuffer, occorrenza); // printf(" "); sprintf(occorrenza, " "); strcat(megabuffer, occorrenza); } printf(megabuffer); write(da, megabuffer, strlen(megabuffer)); //write 1 omino(errori, da); //Stampa dell'omino write 2 printf("Vite rimanenti: %d\n\nInserisci una lettera\n", vite-errori); sprintf(megabuffer,"Vite rimanenti: %d\n\nInserisci una lettera\n", vite-errori); write(da, megabuffer, strlen(megabuffer)); //write 3 //Manca la read da client scanf("%s", lettera); for (i=0;i<len_parola;i++) //Controlla { //Controlla se la lettera e' presente ma sta attento che non sia stata gia' inserita if (strncmp(lettera,&soluzione[i],1)==0 && parola_temp[i]=='_') { parola_temp[i]=*lettera; //Metto la lettera al posto giusto mancanti--; //1 lettera in meno da trovare ok=1; //Ho indovinato 1 lettera } } if (ok==0) //Non ho indovinato errori++; ok=0; //Che abbia indovinato o no, riporto a 0 if (mancanti==0) { //Ho indovinato tutto fine=1; write(da, &fine, sizeof(int)); printf("Complimenti, hai vinto!!!\n"); sprintf(megabuffer, "Complimenti, hai vinto!!!\n"); write(da, megabuffer, strlen(megabuffer)); for (i=0; i<len_parola; i++) { //Stampa soluzione printf("%c", parola_temp[i]); sprintf(occorrenza, "%c", parola_temp[i]); strcat(megabuffer, occorrenza); printf(" "); sprintf(occorrenza, " "); strcat(megabuffer, occorrenza); } printf("\n"); sprintf(occorrenza, "\n"); strcat(megabuffer, occorrenza); write(da, megabuffer, strlen(megabuffer)); exit(1); //Esco dal gioco } if ((vite-errori) == 0) //Ho finito le vite, game over! { fine=1; write(da, &fine, sizeof(int)); sprintf(megabuffer, "---- GAME OVER!!! ----\nLa parola era %s\n", soluzione); write(da, megabuffer, strlen(megabuffer)); printf("---- GAME OVER!!! ----\n"); printf("La parola era %s\n", soluzione); omino(errori, da); //Stampa omino completo exit(1); } printf("FINE: %d\n", fine); //Qui fine vale 0 write(da, &fine, sizeof(int)); } //Chiusura while } // Function omino tagliata, presente nel secondo post (troppi caratteri)
codice:#include <sys/types.h> /*libreria per i tipi non primitivi (pid_t) */ #include <unistd.h> /* libreria read, write, close */ #include <arpa/inet.h> /* liberia per gli IP */ #include <sys/socket.h> /* librearia socket */ #include <stdio.h> /* libreria sugli I/O */ #include <stdlib.h> /* libreria exit */ #include <string.h> /* libreria stringhe */ #include <errno.h> #define PORTA 54321 #define MAX_BUFFER 512 int Socket (int famiglia, int tipo, int protocollo); int menu (char *nickname,int descrittoreAccept); void imp(int ds); int main(int argc, char *argv[]) { int descrittoreServer, scelta; struct sockaddr_in server; char bufferIngresso[MAX_BUFFER], bufferUscita[MAX_BUFFER]; int nread, nwrite; char nickname[33]; descrittoreServer=Socket(AF_INET, SOCK_STREAM, 0); server.sin_family = AF_INET; server.sin_port = htons(PORTA); if ( ( inet_pton(AF_INET, argv[1], &server.sin_addr)) <= 0) { perror ("Connection error"); exit(1); } if (connect(descrittoreServer, (struct sockaddr *) &server, sizeof(server)) < 0) { perror ("Errore di connessione"); exit(1); } printf("Ciao, benvenuto sul nostro server di gioco, inserisci il tuo nome\n"); fgets(nickname, 32, stdin); // printf("nickname: %s", nickname); // printf("lungo: %d", (int)strlen(nickname)-1); write(descrittoreServer, nickname, strlen(nickname)); do { scelta = menu(nickname,descrittoreServer); if (scelta<1 || scelta > 4) printf("Scelta non consentita!!!\n"); } while (scelta <1 || scelta >4); write(descrittoreServer, &scelta, sizeof(int)); switch (scelta) { case 1: break; case 2: { imp(descrittoreServer); break; } case 3: { printf("Disconnesso...\n"); break; } } close(descrittoreServer); exit(0); } int Socket (int famiglia, int tipo, int protocollo) { int n; if (( n = socket(famiglia, tipo, protocollo)) < 0) { perror("Socket"); exit(1); } return (n); } int menu (char *nickname,int descrittoreAccept) { int risposta; char saluto[170]="\nBenvenuto "; strcat(saluto, nickname); strcat(saluto, "Premi 1 per giocare a tris \nPremi 2 per il gioco dell'impiccato \nPremi 3 per disconnetterti\n"); printf("%s",saluto); scanf("%d",&risposta); // write(descrittoreAccept, saluto, (int)strlen(saluto)-1); // nread=read(descrittoreAccept, risp, 1); // risp[nread]=0; // risposta=atoi(risp); return (risposta); } void imp(int ds) { char datiIngresso[512]; char lettera[5]; int fine=0,nread; do { if ((nread = read(ds, datiIngresso, 256)) < 0) //Read 1 { perror("Errore lettura 1"); exit(1); } datiIngresso[nread]=0; printf("%s",datiIngresso); if ((nread = read(ds, datiIngresso, 512)) < 0) //Read 2 (omino) { perror("Errore lettura 2"); exit(1); } datiIngresso[nread]=0; printf("%s",datiIngresso); if ((nread = read(ds, datiIngresso, 256)) < 0) //Read 3 (inserisci lettera) { perror("Errore lettura 3"); exit(1); } datiIngresso[nread]=0; printf("%s",datiIngresso); /* fgets(lettera, 2, stdin); write(ds, lettera, strlen(lettera)); */ if ((nread = read(ds, &fine, sizeof(int)))<0) //Gioco finito? { perror("Errore lettura 3"); exit(1); } printf("Nread: %d\n", nread); //Restituisce 4 (ok) printf("Fine: %d\n", fine); //Numero lungo, sembra una locaz. di memoria.... } while (fine != 0); if (read(ds, datiIngresso, 256) < 0) { perror("Errore lettura 4"); exit(1); } datiIngresso[nread]=0; printf("%s",datiIngresso); if (read(ds, datiIngresso, 256) < 0) { perror("Errore lettura 5"); exit(1); } datiIngresso[nread]=0; printf("%s",datiIngresso); }

Rispondi quotando