Problema client/server

di il
30 risposte

Problema client/server

Salve ragazzi..sono alle prese con un progetto universitario e per quanto stupido vi sembrerà il quesito, non riesco a risolverlo.
Ho un client che deve inviare al server un valore in double ma riesco solo a farlo arrivare come char o come int,nonostante le dovute conversioni..Potete aiutarmi??Grazie

CLIENT

memset(buffer,0,BUFF_SIZE);
printf("inserire numero:\n");
scanf("\n%d",&codice);
snprintf(buffer, sizeof(buffer), "%lf\r\n",citta_cli[codice].lat);  //citta_cli[codice].lat è contenuto in una struct ed è dichiarato double
if ( write(sockfd, buffer, sizeof(buffer)) <0)
    {
    perror("write error");
    exit(-1);
    }
SERVER

memset(buffer,0,BUFF_SIZE);
printf("inserire numero:\n");
scanf("\n%d",&codice);
snprintf(buffer, sizeof(buffer), "%lf\r\n",citta_cli[codice].lat);  //citta_cli[codice].lat è contenuto in una struct ed è dichiarato double
if ( write(sockfd, buffer, sizeof(buffer)) <0)
    {
    perror("write error");
    exit(-1);
    }

30 Risposte

  • Re: Problema client/server

    Il codice per client e server sono la stessa cosa, sei sicuro di aver copiato correttamente?
    Utilizzi lo stesso ambiente (s.o. e compilatore) sia per client che per server?
  • Re: Problema client/server

    Utilizzo stesso s.o. e stesso compilatore..solo, ovviamente,terminali diversi..sbagliato ad inserire il codice del server
    
    memset(buffer,0,BUFF_SIZE);
       if (read(connfd, buffer ,sizeof(buffer))<0)
        {
            perror("read error");
            exit(-1);
            }
    a=atof(buffer);
    printf("buffer: %f \n",a);
    
  • Re: Problema client/server

    Prima di fare
    a=atof(buffer);
    prova a fare un printf() del contenuto di buffer e vediamo cosa ti arriva.
    Accertati poi che a sia dichiarato come double (o float).
  • Re: Problema client/server

    Dichiarato
    double buffer2[BUFF_SIZE];
    e modificato codice in questo modo

    CLIENT
    
    buffer2[BUFF_SIZE]=citta_cli[codice].lat;
        if ( write(sockfd, buffer2, sizeof(buffer2)) <0)
        {
        perror("write error");
        exit(-1);
        }
    printf("\nBUFF2:\n%lf\n",buffer2[BUFF_SIZE]); //mi stampa in maniera esatta ciò che mi serve
    
    SERVER
    
    memset(buffer2,0,BUFF_SIZE);
       if (read(connfd, buffer2 ,sizeof(buffer2))<0)
        {
            perror("read error");
            exit(-1);
            }
    printf("buffer2: %lf \n",buffer2[BUFF_SIZE]);
    
    mi stampa 0.00000..
  • Re: Problema client/server

    double buffer2[BUFF_SIZE];
    questo non è corretto perchè stai confondendo due metodi diversi per spedire il double.
    Puoi seguire uno di questi due metodi
    a) usi una variabile double e la spedisci così
    write(sockfd, &miadouble, sizeof(double) )
    e su server leggi in una variabile double
    b) usi un buffer di caratteri (stringa) che carichi con una sprintf() da client e poi su server interpreti con un atof()
    Tu stai spedendo un array di doubles.
  • Re: Problema client/server

    La soluzione b già l'ho provata..ma mi arriva il numero mi arriva ma senza i decimali ma con #.0000.
    la soluzione a l'ho appena implementata previa dichiarazione globale in entrambi i .c double miavar;
    CLIENT
    
    miavar=citta_cli[codice].lat;
        if ( write(sockfd, &miavar, sizeof(double)) <0)
        {
        perror("write error");
        exit(-1);
        }
    printf("\nprintf di controllo BUFF2:\n%lf\n",miavar); //PER CONTROLLO E MI STAMPA IL NUMERO IN MANIERA CORRETTA
    
    SERVER
    
    if (read(connfd, &miavar ,sizeof(double))<0)
        {
            perror("read error");
            exit(-1);
            }
    printf("buffer2: %lf \n",miavar); //MI STAMPA 0.0000
    
  • Re: Problema client/server

    La soluzione b) (passare per un buffer di caratteri) è la migliore in quanto ti rende indipendente da come è internamente rappresentato un double.
    Riprova quindi la soluzione b) stampando a video su client il contenuto del buffer che spedisci (dopo la snprintf() e prima della write()) e su server il contenuto del buffer che ricevi (prima di trasformarlo con atof()). Il buffer, sia su client che su server, deve ovviamente essere char xxx[BUFSIZE].
    Consiglio inoltre di effettuare anche un memset( buffer, 0, BUFSIZE ) su client, prima della snprintf() per resettare a 0 tutti i caratteri che seguono il terminatore di stringa (che comunque viene inserito da snprintf()).
  • Re: Problema client/server

    Rimodificato codice. dichiarato char buffer[BUFF_SIZE] e
    CLIENT
    
    snprintf(buffer, sizeof(buffer), "%lf\r\n",citta_cli[codice].lat);
    printf("\nprintf di controllo BUFF2:\n%s\n",buffer);
    
        if ( write(sockfd, buffer, sizeof(buffer)) <0)
        {
        perror("write error");
        exit(-1);
        }
    
    e la printf mi restituisce 40.944000

    SERVER
    
    memset(buffer,0,BUFF_SIZE);
       if (read(connfd, buffer,sizeof(buffer))<0)
        {
            perror("read error");
            exit(-1);
            }
    printf("\nbufferINchar: %s \n",buffer);
    a=atof(buffer);
    printf("\nbufferINdoulbe: %lf \n",a);
    
    la prima printf mi stampa 40 e la seconda 40.000000. Errore mio nell'implementazione del codice??
  • Re: Problema client/server

    E' sbagliata la prima snprintf() quindi suppongo che l'errore sia %lf. Prova a impostare semplicemente %f
  • Re: Problema client/server

    Corretto ma l'errore persiste..nel client stampa giusto e nel server uguale all'ultima prova..
    snprintf(buffer, sizeof(buffer), "%f\r\n",citta_cli[codice].lat);
    come posso fare?posso ovviare in altro modoal problema?
  • Re: Problema client/server

    Prova ad inizializzare il valore double con qualcosa diverso da 40, es. 12345.6789f
  • Re: Problema client/server

    I valori di citta_cli[].lat sono contenuti in una sruct..40 era un esempio..me li legge bene nel client, qualunque sia il numero, è nel server che arrivano "troncati" dei decimali
  • Re: Problema client/server

    Usa una variabile per controllare il valore restituito dalla read e visualizzalo nel codice della ricezione
  • Re: Problema client/server

    Il valore è 4..???
Devi accedere o registrarti per scrivere nel forum
30 risposte