PDA

Visualizza la versione completa : [C] Comunicazione client/server tramite socket


Fobia
06-02-2007, 20:05
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


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


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);

oregon
06-02-2007, 20:38
Prima di tutto, stai inviando un puntatore e non il dato puntato e poi non capisco il 12 ...

Fobia
06-02-2007, 20:49
il 12 dovrebbe essere un dato derivato dalla dimensione di buffer...
il puntatore lo passo perché è richiesto dalle funzioni write e read...

oregon
06-02-2007, 20:59
La dimensione del buffer non e' 12 ... e il puntatore a cui mi riferisco non e' &mms ma

char *buffer

Fobia
06-02-2007, 21:10
quindi vuoi dire che invece che &mms devo passare buffer ?? e in questo caso come faccio ad inviare gli altri campi?

oregon
06-02-2007, 21:19
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.

Fobia
06-02-2007, 22:20
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) ??

oregon
07-02-2007, 00:30
Per la sizeof va bene ... ma la struct no ... dovrebbe essere



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

Fobia
07-02-2007, 00:55
non c'è modo di ottenere lo stesso risultato con (char * buffer) nellla struct ?

oregon
07-02-2007, 00:58
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.

Loading