Pagina 1 di 5 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 41
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214

    [C] Read, problemi con interi

    Ciao a tutti ragazzi, ho un problema con una read da una socket. In pratica devo leggere un intero e salvarlo in una variabile. Utilizzando la chiamata:

    codice:
    int64_t* intero; 
    int64_t salva; 
    
    letti=read(socket, &intero, sizeof(int64_t));
    salva = *intero;
    ottengo che vengono letti correttamente 8 byte, ma quando cerco di assegnare il valore contenuto in "intero" ad un'altra variabile, ecco che il valore che ottengo è un valore negativo! Come è possibile? Grazie in anticipo!

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Ma se leggi un int64_t perché non scrivi semplicemente

    codice:
    int64_t salva; 
    
    letti=read(socket, &salva, sizeof(int64_t));
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214
    Così facendo sulla socket c'è scritto "10", nella variabile "salva" il valore si aggira intorno ai 15 milioni! dovrò riguardare la funzione che scrive sulla socket probabilmente!

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da Smoke666
    Così facendo sulla socket c'è scritto "10", nella variabile "salva" il valore si aggira intorno ai 15 milioni! dovrò riguardare la funzione che scrive sulla socket probabilmente!
    Sì, mostra come fai la scrittura ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214
    Per la scrittura impacchetto una struttura message_t in un unico buffer, che inizia con un header contenente la lunghezza del messaggio inviato. Il buffer è così costruito:

    codice:
    int64_t header;
    len = strlen(&msg->type) + strlen(msg->buffer) +3;
    	da_inviare = (char*) malloc(len * sizeof(char) );
    	reall = realloc(da_inviare, sizeof(int64_t) );
    	if (reall == NULL){
    		errno = ENOMEM;
    		free(da_inviare);
    		return -1;
    	}
    	header = (int64_t) len;
    	/*Inserisco l'header nel messaggio*/
    	sprintf(da_inviare, "%" PRId64, header);
    	/*Compongo il messaggio, scrivendo solo i caratteri significativi sul buffer da inviare.*/
    	strcat(da_inviare, strcat(&msg->type,":"));
    	strncat(da_inviare, strcat(msg->buffer,"\n"), msg->length);
    	/*Scrivo il messaggio sulla socket*/
    	inviati = write(sc, &da_inviare, len);
    	free(da_inviare);
    	da_inviare = NULL;
    Il messaggio è inviato correttamente ed è nella forma: "15Q:Messaggio\n". La read dovrebbe innanzitutto leggere quel "15", successivamente tutto il resto..

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Scusa ma dovresti riguardarti decisamente lo studio delle variabili puntatore.
    Ci sono vari errori, a partire dal "salva" già segnalato da oregon, passando per la write
    dove dovevi usare:
    write(sc, buffer, len);
    e non
    write(sc, &buffer, len);
    oppure per &msg->type, che non so cosa sia type, ma se era una array, visto che usi strlen, era ovviamente "msg->type" senza "&"

    P.S. Riguardo alla strncat, ottimo usarla, però fai attenzione se la stai usando (1) perché la tua stringa non è null-terminated o (2) perché non vuoi sforare la lunghezza del buffer. In quest'ultimo caso quel msg->length è lo spazio disponibile rimanente? Non mi pare che nelle righe precedenti sia stato calcolato...

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214
    La write prende in ingresso un void* , dunque se buffer è una variabile di tipo char, è necessario che alla write sia passata come &buffer. "msg" è una struttura da me definita, dichiarata come

    codice:
    typedef struct {
      /** tipo del messaggio */
        char type;           
      /** lunghezza messaggio in byte */
        unsigned int length; 
      /** buffer messaggio */
        char buffer[MAXBUF];        
    } message_t;
    e passata alla funzione in questione come puntatore, dunque l'uso di &msg è essenziale.

    Resta il fatto che la scrittura viene effettuata correttamente e senza errori, è in lettura che sorgono i problemi, come dicevo prima, non riesco a leggere correttamente l'intero contenuto nella prima parte del buffer.

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    La write prende in ingresso un void* , dunque se buffer è una variabile di tipo char, è necessario che alla write sia passata come &buffer. "msg"
    Ma assolutamente no, è per questo che ti dico di ripassare le variabili puntatore.
    Il nome dell'array è un puntatore che punta al suo primo elemento.

    Esempio:
    char buffer[MAXBUF];
    char *puntatore_a_buffer;
    puntatore_a_buffer = buffer;

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da Smoke666
    La write prende in ingresso un void* , dunque se buffer è una variabile di tipo char
    No ... buffer è di tipo

    char *

    e non char

    Quindi quello che ti ha detto c0der è corretto dato che buffer è già un puntatore a char.

    Anche su msg->type c0der ha ragione dato che type è un char e non puoi proprio usare la strlen.

    Quindi, già questa linea

    len = strlen(&msg->type) + strlen(msg->buffer) +3;

    è sbagliata.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214
    Ok si è fatto un po di confusione con il nome delle variabili. Nella funzione che ho scritto sopra non uso il buffer che è definito nella struttura, è semplicemente una variabile da me definita nella funzione stessa. Rinomino, così si evita confusione!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.