Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Il Client riceve dati corrotti dal server!!
Forum - C/C++ - Il Client riceve dati corrotti dal server!!

Avatar
SpezzaC (Normal User)
Newbie


Messaggi: 1
Iscritto: 28/02/2014

Segnala al moderatore
Postato alle 0:37
Venerdì, 28/02/2014
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.

Il problema si verifica nella riga 143 del server e 203 client

SERVER

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <sys/types.h>
  4. #include <sys/socket.h>
  5. #include <netinet/in.h>
  6. #include <netdb.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9. #include <unistd.h>
  10. #include <stdbool.h>
  11. #define FLUSH while(getchar()!='\n')
  12.  
  13.  
  14. #define N 100
  15. #define STR 50
  16. int cod=100;
  17.  
  18. struct ogg{
  19.         char nome[STR], venditore[STR], offerente[STR];
  20.         int base, durata, offerta, codice;
  21. }oggetto[N];
  22.  
  23. void VisualizzaElementoVend(struct ogg x){
  24.      printf("\n--Info oggetto--");
  25.      printf("\nNome: %s", x.nome);
  26.      printf("\nVenditore: %s", x.venditore);
  27.      printf("\nBase d'Asta: %d", x.base);
  28.      printf("\n\n--Info offerte--");
  29.      printf("\nOfferta Max: %d", x.offerta);
  30.      printf("\nOfferente: %s", x.offerente);
  31. }
  32.  
  33. void VisualizzaElementoAcq(struct ogg x){
  34.      printf("\n--Info oggetto--");
  35.      printf("\nNome: %s", x.nome);
  36.      printf("\n\n--Info offerte--");
  37.      printf("\nOfferta Max: %d", x.offerta);
  38. }
  39.  
  40.  
  41. /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
  42.  
  43.  
  44.  
  45. int main(){
  46.  
  47. printf("****** SERVER ******\n");
  48.  
  49. /*instaurazione collegamento*/
  50.  
  51. struct sockaddr_in server_addr; /* indirizzo del server */
  52. struct sockaddr_in client_addr; /* indirizzo del client */
  53. int sd_server, sd_client; /* i socket descriptor usati per identificare server e client */
  54. // Creazione socket descriptor per il server.
  55. // AF_INET + SOCK_STREAM --> TCP, utilizzo del protocollo TCP (IPPROTO_TCP)
  56. if((sd_server = socket(AF_INET, SOCK_STREAM, 0)) < 0)
  57.                 printf("Errore nella creazione del server\n");
  58. /* Inseriamo nella struttura alcune informazioni */
  59. server_addr.sin_family = AF_INET; /* la famiglia dei protocolli */
  60. server_addr.sin_port = htons(1745); /* porta in ascolto */
  61. server_addr.sin_addr.s_addr = INADDR_ANY; /* dato che è un server
  62. bisogna associargli l'indirizzo della macchina su cui sta girando*/
  63. /* Assegnazione del processo alla socket tramite la funzione BIND */
  64. if(bind(sd_server, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)
  65.                 printf("Errore di binding\n");
  66. /* Si mette in ascolto con un massimo di 5 connessioni */
  67. listen (sd_server, 5);
  68. /* Quindi accetterà una sola connessione per volta */
  69. int address_size = sizeof(client_addr); /* dimensione della struttura client_addr */
  70.  
  71. if((sd_client = accept(sd_server, (struct sockaddr *)&client_addr, & address_size)) < 0)
  72.                 printf("Errore nella chiamata accept\n");
  73. printf("Connessione accettata!!!\n");
  74. /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
  75.  
  76. /* ricezione dati dal client */
  77.        
  78. int i=0, j, req, cod, flag;
  79.  
  80. while(1){
  81.         recv(sd_client,&req,sizeof(int),0);
  82.        
  83.         switch(req){
  84.                 case 1:
  85.                         printf("\n\nRichiesta 1 ricevuta!");
  86.                         recv(sd_client,&oggetto[i],sizeof(oggetto[i]),0);
  87.                         printf("\nNome: %s", oggetto[i].nome);
  88.                         printf("\nCodice: %d", oggetto[i].codice);
  89.                         printf("\nBase d'Asta: %d", oggetto[i].base);
  90.                         i++;
  91.                        
  92.                         break;
  93.                
  94.                 case 2:
  95.                         printf("\n\nRichiesta 2 ricevuta!");
  96.                         recv(sd_client,&cod,sizeof(int),0);
  97.                         printf("\nCerco l'oggetto con codice: %d",cod);
  98.                         flag=0;
  99.                         for(j=0; j<100 && flag==0; j++){
  100.                                 if(cod==oggetto[j].codice) {
  101.                                         flag=1;
  102.                                         send(sd_client,&oggetto[j],sizeof(oggetto[j]),0);
  103.                                         }
  104.                                 }
  105.                         if(j>=100){
  106.                                 oggetto[j].durata=0;
  107.                                 send(sd_client,&oggetto[j],sizeof(oggetto[j]),0);
  108.                                 }
  109.                         break;
  110.                  
  111.                 case 3:
  112.                         printf("\n\nRichiesta 3 ricevuta!");
  113.                         int stop=0;
  114.                         for(j=0; j<100; j++){
  115.                                 if(oggetto[j].durata==0){
  116.                                         stop=1;
  117.                                         send(sd_client,&stop,sizeof(int),0);
  118.                                         }
  119.                                     else{
  120.                                         send(sd_client,&stop,sizeof(int),0);
  121.                                         send(sd_client,&oggetto[j],sizeof(oggetto[j]),0);
  122.                                         }
  123.                                 }
  124.                  
  125.                         break;
  126.                
  127.                 case 4:
  128.                         printf("\n\nRichiesta 4 ricevuta!");
  129.                         recv(sd_client,&cod,sizeof(int),0);
  130.                         flag=0;
  131.                         int pos=0;
  132.                         for(j=0; j<100 && flag==0; j++){
  133.                                 if(cod==oggetto[j].codice){
  134.                                         flag=1;
  135.                                         pos=j;
  136.  
  137. //faccio la stampa poco prima di inviare e i dati sono corretti
  138.                                         printf("\nNome: %s", oggetto[j].nome);
  139.                                         printf("\nCodice: %d", oggetto[j].codice);
  140.                                         printf("\nBase d'Asta: %d", oggetto[j].base);
  141.                                        
  142.                                         }
  143.                                 }
  144.                                
  145.                                 write(sd_client,&oggetto[pos],sizeof(oggetto[pos]));
  146.                                         read(sd_client,&oggetto[pos],sizeof(oggetto[pos]));
  147.                                        
  148.                                         printf("\nNome: %s", oggetto[pos].nome);
  149.                                         printf("\nCodice: %d", oggetto[pos].codice);
  150.                                         printf("\nOfferta: %d", oggetto[pos].offerta);
  151.                                         printf("\nBase d'Asta: %d", oggetto[pos].base);
  152.                                         printf("\nVenditore: %s", oggetto[pos].venditore);
  153.                        
  154.                        /* if(j>=100){
  155.                                 oggetto[j].durata=0;
  156.                                 send(sd_client,&oggetto[j],sizeof(oggetto[j]),0);
  157.                                 }
  158.                          */    
  159.                 }
  160.         }
  161.        
  162. }




CLIENT

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <sys/types.h>
  4. #include <sys/socket.h>
  5. #include <netinet/in.h>
  6. #include <netdb.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9. #include <unistd.h>
  10. #include <stdbool.h>
  11. #define FLUSH while(getchar()!='\n')
  12.  
  13. #define STR 50
  14. int cod=100;
  15.  
  16. struct ogg{
  17.         char nome[STR], venditore[STR], offerente[STR];
  18.         int base, durata, offerta, codice;
  19. }oggetto;
  20.  
  21.  
  22.  
  23. void leggi_stringa(char s[], unsigned int dim){
  24.      unsigned int i;
  25.      
  26.      for(i=0; (s[i]=getchar())!='\n' && i<dim-1; i++);
  27.      s[i]='\0';
  28.      if(i==dim-1) while(getchar()!='\n');
  29. }
  30.  
  31. void LeggiElementoVend(){
  32.      printf("\n-----Info Oggetto-----");
  33.      fflush(stdout);
  34.      printf("\nInserire il nome dell'oggetto: ");
  35.      leggi_stringa(oggetto.nome, STR);
  36.      fflush(stdout);
  37.      printf("Inserire il nome del venditore : ");
  38.      leggi_stringa(oggetto.venditore, STR);
  39.      fflush(stdout);
  40.      printf("Inserire la base di partenza dell'asta: ");
  41.      scanf("%d",&oggetto.base);
  42.      //FLUSH;
  43.      fflush(stdin);
  44.      do{
  45.         fflush(stdout);
  46.         printf("Inserire la durata dell'asta (h - min 24h): ");
  47.         scanf("%d",&oggetto.durata);
  48.         //FLUSH;
  49.         fflush(stdin);
  50.         }while(oggetto.durata<=23);
  51.      cod++;
  52.      oggetto.codice=cod;
  53.      fflush(stdout);
  54.      printf("\nIl codice dell'oggetto è: %d",oggetto.codice);
  55.      
  56. }
  57.  
  58.  
  59. void VisualizzaElementoVend(){
  60.      printf("\n--Info oggetto--");
  61.      printf("\nNome: %s", oggetto.nome);
  62.      printf("\nVenditore: %s", oggetto.venditore);
  63.      printf("\nBase d'Asta: %d", oggetto.base);
  64.      printf("\n\n--Info offerte--");
  65.      if (oggetto.offerta==0) printf("\nOfferta Max: Nessuna offerta");
  66.         else {
  67.               printf("\nOfferta Max: %d", oggetto.offerta);
  68.               printf("\nOfferente: %s", oggetto.offerente);
  69.               }
  70. }
  71.  
  72. void VisualizzaElementoAcq(){
  73.      printf("\n\n++++++++++++--Info oggetto--++++++++++++");
  74.      printf("\nNome: %s", oggetto.nome);
  75.      printf("\nCodice: %d", oggetto.codice);
  76.      printf("\nBase d'Asta: %d", oggetto.base);
  77.      printf("\n\n--Info offerte--");
  78.      if (oggetto.offerta==0) printf("\nOfferta Max: Nessuna offerta");
  79.         else printf("\nOfferta Max: %d", oggetto.offerta);
  80. }
  81.  
  82.  
  83. /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
  84.  
  85. int main(){
  86.  
  87. printf("****** CLIENT ******\n");
  88.  
  89. /*instaurazione collegamento*/
  90.  
  91. int sd; /* Il socket descriptor del client */
  92. struct sockaddr_in server_addr; /* l'indirizzo del server */
  93.  
  94. /* Utilizzando la struttura hostent si definisce l'indirizzo del server */
  95. struct hostent *hp;
  96. hp = gethostbyname("127.0.0.1");
  97. server_addr.sin_family = AF_INET;
  98. server_addr.sin_port = htons(1745);
  99. /* successivamente viene memorizzato nella struttura server_addr */
  100. server_addr.sin_addr.s_addr = ((struct in_addr*)(hp->h_addr)) ->s_addr;
  101. /* Viene creato il socket descriptor */
  102. if((sd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
  103. printf("Errore nella creazione della socket\n");
  104. /* Viene connesso al server */
  105. if(connect(sd, (struct sockaddr *)&server_addr, sizeof(server_addr)) <0)
  106. printf("Errore di connessione al server\n");
  107.  
  108. /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
  109.  
  110. srand(time(NULL));
  111.  
  112. int i=0, cod;
  113. int op1, op2, op3, req;
  114.         start:
  115.         do{
  116.           printf("\n\n**Menu'**");
  117.           printf("\n1-Venditore");
  118.           printf("\n2-Offerente");
  119.           printf("\n3-Fine");
  120.           printf("\n\nInserisci scelta: ");
  121.           scanf("%d", &op1);
  122.           FLUSH;
  123.           switch(op1){
  124.            
  125.            case 1:
  126.                 do{
  127.                 printf("\n\nMenu' Venditore");
  128.                 printf("\n1-Inserire nuovo oggetto");
  129.                 printf("\n2-Visualizzare stato oggetto all'asta");
  130.                 printf("\n3-Tornare indietro");
  131.                 printf("\n\nInserisci scelta: ");
  132.                 scanf("%d", &op2);
  133.                 FLUSH;
  134.                 switch(op2){
  135.                        
  136.                  case 1:
  137.                       req=1;
  138.                       send(sd,&req,sizeof(int),0);
  139.                       LeggiElementoVend();
  140.                       printf("\nnome : %s",oggetto.nome);
  141.                       send(sd,&oggetto,sizeof(oggetto),0);
  142.                      
  143.                       break;
  144.                  
  145.                  case 2:
  146.                       req=2;
  147.                       send(sd,&req,sizeof(int),0);
  148.                       printf("\n-----Info oggetto-----");
  149.                       printf("\nInserire codice dell'oggetto: ");
  150.                       scanf("%d",&cod);
  151.                       send(sd,&cod,sizeof(int),0);
  152.                       recv(sd,&oggetto,sizeof(oggetto),0);
  153.                       if(oggetto.durata==0) printf("\nOggetto non trovato!");
  154.                         else VisualizzaElementoVend();
  155.                      
  156.                        
  157.                       break;
  158.                  
  159.                   }
  160.                  }while(op2<3);
  161.                  
  162.                  goto start;
  163.                  
  164.            case 2:
  165.                 do{
  166.                 printf("\n\nMenu' Offerente");
  167.                 printf("\n1-Visualizzare elenco oggetti all'asta");
  168.                 printf("\n2-Fare un'offerta");
  169.                 printf("\n3-Tornare indietro");
  170.                 printf("\n\nInserisci scelta: ");
  171.                 scanf("%d", &op3);
  172.                 FLUSH;
  173.                 switch(op3){
  174.                        
  175.                  case 1:
  176.                       req=3;
  177.                       send(sd,&req,sizeof(int),0);
  178.                       int stop=0;
  179.                       while(stop==0){
  180.                                 recv(sd,&stop,sizeof(int),0);
  181.                                 if(stop==0){
  182.                                         recv(sd,&oggetto,sizeof(oggetto),0);
  183.                                         VisualizzaElementoAcq();
  184.                                         }
  185.                                 }
  186.                                
  187.                       break;
  188.                  
  189.                  case 2:
  190.                       req=4;
  191.                       send(sd,&req,sizeof(int),0);  
  192.                       printf("\n-----Info oggetto-----");
  193.                       printf("\nInserire codice dell'oggetto: ");
  194.                       scanf("%d",&cod);
  195.                       FLUSH;
  196.                       write(sd,&cod,sizeof(int));
  197.                      
  198.                       read(sd,&oggetto,sizeof(oggetto));
  199.                        
  200.                       //if(oggetto.durata==0) printf("\nOggetto non trovato!");
  201.                         //else{
  202.  
  203. //questa è la parte di codice che non funziona. Arrivati a questa visualizzazioni i dati non corrispondono più.
  204.                                 VisualizzaElementoAcq();
  205.                                 printf("\nL'offerta deve essere maggiore all'ultima\nSe non è presente nessuna offerta, l'offerta minima è la base d'asta");
  206.                                 printf("\n\nInserire nome offerente: ");
  207.                                 leggi_stringa(oggetto.offerente,STR);
  208.                                 int off;
  209.                                 do{
  210.                                         printf("\nInserire nuova offerta: ");
  211.                                         scanf("%d",&off);
  212.                                         FLUSH;
  213.                                 }while(off<=oggetto.offerta);
  214.                                 oggetto.offerta=off;
  215.                                 send(sd,&oggetto,sizeof(oggetto),0);
  216.                         //}  
  217.                
  218.                     break;
  219.                  }
  220.                  }while (op3<3);
  221.                  
  222.              goto start;
  223.                
  224.         }
  225.      }while(op2<3);
  226.      
  227. }


Ultima modifica effettuata da SpezzaC il 28/02/2014 alle 0:50
PM Quote