Il Client riceve dati corrotti dal server!!

di il
3 risposte

Il Client riceve dati corrotti dal server!!

Salve a tutti, stavo lavorando su questo progetto ed andava tutto bene fino a quando in un determinato punto del programma quando il client riceve dei dati dal server questi arrivano tutti con i valori settati a 1 anche se il server li invia correttamente penso perchè glieli faccio stampare poco prima dell'invio. La cosa strana è che questo pezzo di codice che mi da problemi l'ho utilizzato in altre parti del programma ed è funzionato benissimo...sinceramente non so quale sia il problema, se qualcuno potesse aiutarmi gliene sarei grato. In seguito inserisco il codice del programma sia server che client.

SERVER
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <stdbool.h>
#define FLUSH while(getchar()!='\n')

#define N 100
#define STR 50
int cod=100;

struct ogg{
        char nome[STR], venditore[STR], offerente[STR];
        int base, durata, offerta, codice;
}oggetto[N];

void VisualizzaElementoVend(struct ogg x){
     printf("\n--Info oggetto--");
     printf("\nNome: %s", x.nome);
     printf("\nVenditore: %s", x.venditore);
     printf("\nBase d'Asta: %d", x.base);
     printf("\n\n--Info offerte--");
     printf("\nOfferta Max: %d", x.offerta);
     printf("\nOfferente: %s", x.offerente);
}

void VisualizzaElementoAcq(struct ogg x){
     printf("\n--Info oggetto--");
     printf("\nNome: %s", x.nome);
     printf("\n\n--Info offerte--");
     printf("\nOfferta Max: %d", x.offerta);
}


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/



int main(){

printf("****** SERVER ******\n");

/*instaurazione collegamento*/

struct sockaddr_in server_addr; /* indirizzo del server */
struct sockaddr_in client_addr; /* indirizzo del client */
int sd_server, sd_client; /* i socket descriptor usati per identificare server e client */
// Creazione socket descriptor per il server.
// AF_INET + SOCK_STREAM --> TCP, utilizzo del protocollo TCP (IPPROTO_TCP)
if((sd_server = socket(AF_INET, SOCK_STREAM, 0)) < 0)
                printf("Errore nella creazione del server\n");
/* Inseriamo nella struttura alcune informazioni */
server_addr.sin_family = AF_INET; /* la famiglia dei protocolli */
server_addr.sin_port = htons(1745); /* porta in ascolto */
server_addr.sin_addr.s_addr = INADDR_ANY; /* dato che è un server
bisogna associargli l'indirizzo della macchina su cui sta girando*/
/* Assegnazione del processo alla socket tramite la funzione BIND */
if(bind(sd_server, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)
                printf("Errore di binding\n");
/* Si mette in ascolto con un massimo di 5 connessioni */
listen (sd_server, 5);
/* Quindi accetterà una sola connessione per volta */
int address_size = sizeof(client_addr); /* dimensione della struttura client_addr */

if((sd_client = accept(sd_server, (struct sockaddr *)&client_addr, & address_size)) < 0)
                printf("Errore nella chiamata accept\n");
printf("Connessione accettata!!!\n");
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

/* ricezione dati dal client */
       
int i=0, j, req, cod, flag;

while(1){
        recv(sd_client,&req,sizeof(int),0);
        
        switch(req){
                case 1:
                        printf("\n\nRichiesta 1 ricevuta!");
                        recv(sd_client,&oggetto[i],sizeof(oggetto[i]),0);
                        printf("\nNome: %s", oggetto[i].nome);
                        printf("\nCodice: %d", oggetto[i].codice);
                        printf("\nBase d'Asta: %d", oggetto[i].base);
                        i++;
                        
                        break;
                
                case 2:
                        printf("\n\nRichiesta 2 ricevuta!");
                        recv(sd_client,&cod,sizeof(int),0);
                        printf("\nCerco l'oggetto con codice: %d",cod);
                        flag=0;
                        for(j=0; j<100 && flag==0; j++){
                                if(cod==oggetto[j].codice) {
                                        flag=1;
                                        send(sd_client,&oggetto[j],sizeof(oggetto[j]),0); 
                                        }
                                }
                        if(j>=100){
                                oggetto[j].durata=0;
                                send(sd_client,&oggetto[j],sizeof(oggetto[j]),0); 
                                }
                        break;
                 
                case 3:
                        printf("\n\nRichiesta 3 ricevuta!");
                        int stop=0;
                        for(j=0; j<100; j++){
                                if(oggetto[j].durata==0){
                                        stop=1;
                                        send(sd_client,&stop,sizeof(int),0);
                                        }
                                    else{
                                        send(sd_client,&stop,sizeof(int),0); 
                                        send(sd_client,&oggetto[j],sizeof(oggetto[j]),0);
                                        }
                                }
                  
                        break;
                
                case 4:
                        printf("\n\nRichiesta 4 ricevuta!");
                        recv(sd_client,&cod,sizeof(int),0);
                        flag=0;
                        int pos=0;
                        for(j=0; j<100 && flag==0; j++){
                                if(cod==oggetto[j].codice){
                                        flag=1;
                                        pos=j;
                                        printf("\nNome: %s", oggetto[j].nome);
                                        printf("\nCodice: %d", oggetto[j].codice);
                                        printf("\nBase d'Asta: %d", oggetto[j].base);
                                        
                                        }
                                }
                                
                                write(sd_client,&oggetto[pos],sizeof(oggetto[pos])); 
                                        read(sd_client,&oggetto[pos],sizeof(oggetto[pos]));
                                        
                                        printf("\nNome: %s", oggetto[pos].nome);
                                        printf("\nCodice: %d", oggetto[pos].codice);
                                        printf("\nOfferta: %d", oggetto[pos].offerta);
                                        printf("\nBase d'Asta: %d", oggetto[pos].base);
                                        printf("\nVenditore: %s", oggetto[pos].venditore);
                        
                       /* if(j>=100){
                                oggetto[j].durata=0;
                                send(sd_client,&oggetto[j],sizeof(oggetto[j]),0); 
                                }
                         */     
                }
        }
        
}
CLIENT
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <stdbool.h>
#define FLUSH while(getchar()!='\n')

#define STR 50
int cod=100;

struct ogg{
        char nome[STR], venditore[STR], offerente[STR];
        int base, durata, offerta, codice;
}oggetto;



void leggi_stringa(char s[], unsigned int dim){
     unsigned int i;
     
     for(i=0; (s[i]=getchar())!='\n' && i<dim-1; i++);
     s[i]='\0';
     if(i==dim-1) while(getchar()!='\n');
}

void LeggiElementoVend(){
     printf("\n-----Info Oggetto-----");
     fflush(stdout);
     printf("\nInserire il nome dell'oggetto: ");
     leggi_stringa(oggetto.nome, STR);
     fflush(stdout);
     printf("Inserire il nome del venditore : ");
     leggi_stringa(oggetto.venditore, STR);
     fflush(stdout);
     printf("Inserire la base di partenza dell'asta: ");
     scanf("%d",&oggetto.base);
     //FLUSH;
     fflush(stdin);
     do{
        fflush(stdout);
        printf("Inserire la durata dell'asta (h - min 24h): ");
        scanf("%d",&oggetto.durata);
        //FLUSH;
        fflush(stdin);
        }while(oggetto.durata<=23);
     cod++;
     oggetto.codice=cod;
     fflush(stdout);
     printf("\nIl codice dell'oggetto è: %d",oggetto.codice);
     
}


void VisualizzaElementoVend(){
     printf("\n--Info oggetto--");
     printf("\nNome: %s", oggetto.nome);
     printf("\nVenditore: %s", oggetto.venditore);
     printf("\nBase d'Asta: %d", oggetto.base);
     printf("\n\n--Info offerte--");
     if (oggetto.offerta==0) printf("\nOfferta Max: Nessuna offerta");
        else {
              printf("\nOfferta Max: %d", oggetto.offerta);
              printf("\nOfferente: %s", oggetto.offerente);
              }
}

void VisualizzaElementoAcq(){
     printf("\n\n++++++++++++--Info oggetto--++++++++++++");
     printf("\nNome: %s", oggetto.nome);
     printf("\nCodice: %d", oggetto.codice);
     printf("\nBase d'Asta: %d", oggetto.base);
     printf("\n\n--Info offerte--");
     if (oggetto.offerta==0) printf("\nOfferta Max: Nessuna offerta");
        else printf("\nOfferta Max: %d", oggetto.offerta);
}


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

int main(){

printf("****** CLIENT ******\n");

/*instaurazione collegamento*/

int sd; /* Il socket descriptor del client */
struct sockaddr_in server_addr; /* l'indirizzo del server */

/* Utilizzando la struttura hostent si definisce l'indirizzo del server */
struct hostent *hp;
hp = gethostbyname("127.0.0.1");
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(1745);
/* successivamente viene memorizzato nella struttura server_addr */
server_addr.sin_addr.s_addr = ((struct in_addr*)(hp->h_addr)) ->s_addr;
/* Viene creato il socket descriptor */
if((sd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
printf("Errore nella creazione della socket\n");
/* Viene connesso al server */
if(connect(sd, (struct sockaddr *)&server_addr, sizeof(server_addr)) <0)
printf("Errore di connessione al server\n");

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

srand(time(NULL));

int i=0, cod;
int op1, op2, op3, req;
        start:
        do{
          printf("\n\n**Menu'**");
          printf("\n1-Venditore");
          printf("\n2-Offerente");
          printf("\n3-Fine");
          printf("\n\nInserisci scelta: ");
          scanf("%d", &op1);
          FLUSH;
          switch(op1){
           
           case 1:
                do{
                printf("\n\nMenu' Venditore");
                printf("\n1-Inserire nuovo oggetto");
                printf("\n2-Visualizzare stato oggetto all'asta");
                printf("\n3-Tornare indietro");
                printf("\n\nInserisci scelta: ");
                scanf("%d", &op2);
                FLUSH;
                switch(op2){
                        
                 case 1:
                      req=1;
                      send(sd,&req,sizeof(int),0); 
                      LeggiElementoVend();
                      printf("\nnome : %s",oggetto.nome);
                      send(sd,&oggetto,sizeof(oggetto),0);
                      
                      break;
                 
                 case 2:
                      req=2;
                      send(sd,&req,sizeof(int),0); 
                      printf("\n-----Info oggetto-----");
                      printf("\nInserire codice dell'oggetto: ");
                      scanf("%d",&cod);
                      send(sd,&cod,sizeof(int),0);
                      recv(sd,&oggetto,sizeof(oggetto),0);
                      if(oggetto.durata==0) printf("\nOggetto non trovato!");
                        else VisualizzaElementoVend();
                      
                        
                      break;
                 
                  }
                 }while(op2<3);
                 
                 goto start;
                 
           case 2:
                do{
                printf("\n\nMenu' Offerente");
                printf("\n1-Visualizzare elenco oggetti all'asta");
                printf("\n2-Fare un'offerta");
                printf("\n3-Tornare indietro");
                printf("\n\nInserisci scelta: ");
                scanf("%d", &op3);
                FLUSH;
                switch(op3){
                        
                 case 1: 
                      req=3;
                      send(sd,&req,sizeof(int),0);
                      int stop=0;
                      while(stop==0){
                                recv(sd,&stop,sizeof(int),0);
                                if(stop==0){
                                        recv(sd,&oggetto,sizeof(oggetto),0);
                                        VisualizzaElementoAcq();
                                        }
                                }
                                
                      break;
                 
                 case 2:
                      req=4;
                      send(sd,&req,sizeof(int),0);  
                      printf("\n-----Info oggetto-----");
                      printf("\nInserire codice dell'oggetto: ");
                      scanf("%d",&cod);
                      FLUSH;
                      write(sd,&cod,sizeof(int));
                      
                      read(sd,&oggetto,sizeof(oggetto));
                       
                      //if(oggetto.durata==0) printf("\nOggetto non trovato!");
                        //else{

//questa è la parte di codice che non funziona. Arrivati a questa visualizzazioni i dati non corrispondono più.
                                VisualizzaElementoAcq();
                                printf("\nL'offerta deve essere maggiore all'ultima\nSe non è presente nessuna offerta, l'offerta minima è la base d'asta");
                                printf("\n\nInserire nome offerente: ");
                                leggi_stringa(oggetto.offerente,STR);
                                int off;
                                do{
                                        printf("\nInserire nuova offerta: ");
                                        scanf("%d",&off);
                                        FLUSH;
                                }while(off<=oggetto.offerta);
                                oggetto.offerta=off;
                                send(sd,&oggetto,sizeof(oggetto),0);
                        //}   
                
                    break;
                 }
                 }while (op3<3);
                 
             goto start;
                
        }
     }while(op2<3);
     
}

3 Risposte

Devi accedere o registrarti per scrivere nel forum
3 risposte