Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2005
    Messaggi
    115

    [C] comunicazione client/server tramite socket

    salve a tutti
    ho un problema nella stampa di un puntatore a char contenuto in una struct.
    la situazione è la seguente:
    un client riempie una struct composta da 3 campi, di cui uno è char * buffer, e la invia tramite una write() su un socket correttamente creato e connesso al socket del server.
    il server legge dal suo socket tramite la write () e memorizza il contenuto in una identica struttura.
    quando voglio stampra il campo char * buffer non ottengo il risultato atteso ma una serie di caratteri casuali.
    quale può essere il problema?
    vi posto la parte interessata di codice e vi ringrazio

    SERVER
    codice:
    typedef struct {
         
       char type;
       unsigned int length;
       char *buffer;
      
      }message_t;
    
    ... connessione al socket ...
    
    int salva;
    message_t mms;  
    mms.buffer = malloc(sizeof(char));
    salva = read(fdclient,&mms,12);    
    printf("Ho ricevuto il nome con %s\n",mms.buffer);
    CLIENT
    codice:
    typedef struct {
     
        char type;
        unsigned int length;
        char *buffer;
       
      }message_t;
     
     message_t mms;
     mms.buffer = malloc(10*sizeof(char));
     int salva;
    salva =  write(fdclient, &mms, 12);
    printf("ho scritto %s\n" , mms.buffer);

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,304
    Prima di tutto, stai inviando un puntatore e non il dato puntato e poi non capisco il 12 ...

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2005
    Messaggi
    115
    il 12 dovrebbe essere un dato derivato dalla dimensione di buffer...
    il puntatore lo passo perché è richiesto dalle funzioni write e read...

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,304
    La dimensione del buffer non e' 12 ... e il puntatore a cui mi riferisco non e' &mms ma

    char *buffer

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2005
    Messaggi
    115
    quindi vuoi dire che invece che &mms devo passare buffer ?? e in questo caso come faccio ad inviare gli altri campi?

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,304
    No ... non ho detto questo.

    E' giusto passare mms per indirizzo ma nella struttura non ci puo' stare il puntatore alla stringa ma ci deve stare la stringa. Inoltre, il 12 e' sbagliato.

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2005
    Messaggi
    115
    purtroppo sono condizionato e devo usare per forza quella struct così com'è... come posso risolvere il problema? per quanto riguarda il 12 posso sostituirlo con sizeof(message_t) ??

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,304
    Per la sizeof va bene ... ma la struct no ... dovrebbe essere

    codice:
    typedef struct
    {
       char type;
       unsigned int length;
       char buffer[10];
    } message_t;

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2005
    Messaggi
    115
    non c'è modo di ottenere lo stesso risultato con (char * buffer) nellla struct ?

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,304
    No ... perche' se tu invii il puntatore ad una stringa, stai inviando un indirizzo di memoria da cui inizia il dato vero e proprio, ovvero la stringa, ma NON stai mandando il dato.
    Il sistema che riceve tale valore, in genere, non condivide la memoria con quello che trasmette e quindi non se ne fara' nulla di un indirizzo magari non valido per lui, e non potra' accedere in ogni caso ai dati.

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 © 2020 vBulletin Solutions, Inc. All rights reserved.