Ciao a tutti, ho realizzato un protocollo di comunicazione tra due processi mediante una socket. Questi si scambiano una struttura contenente un char, un intero e una stringa.
Il messaggio inviato viene impacchettato in un buffer costituito in questo modo:codice:typedef struct { /** tipo del messaggio */ char type; /** lunghezza messaggio in byte */ unsigned int length; /** buffer messaggio */ char buffer[MAXBUF]; } message_t;
Quando un processo invia un messaggio, stampa a video la stringa corrispondente al messaggio, e attende che il secondo processo gli risponda con la medesima stringa. Ad esempio un modello di comunicazione è il seguente:codice:buffer[0] = msg.type; buffer[1] = msg.length; //intero formattato come int64_t corrispondente alla lunghezza del campo buffer buffer[sizeof(int64_t)+1] = msg.buffer;
Processo1 invia: <T><9><messaggio>
Processo1 riceve: <T><9><messaggio>
T rappresenta msg.type, 9 rappresenta msg.length e "messaggio" rappresenta msg.buffer.
La comunicazione avviene senza problemi poichè i due processi scambiano messaggi correttamente. Il problema sorge "localmente" al processo. Ovvero, ho definito una funzione che stampa la struttura message_t, struttura popolata mediante i messaggi scambiati sulla socket. La funzione è la seguente:
Il problema è che il campo lenght contiene un valore numerico in formato macchina, dunque la condizione msg->length == 0 risulta sempre vera.codice:printMessage(message_t*msg){ if ( msg->length == 0 ) { printf("%c : <void>\n", msg->type); return; } printf("%c : %s\n", msg->type,msg->buffer); }
Questo valore è memorizzato mediante la chiamata:
read(socket, msg->length, sizeof(int64_t);
Quale funzione di conversione devo utilizzare per poter usare questo valore? Ho provato con le funzioni definite in endian.h ma senza risultati. Sono sicuro che il valore sia correttamente scambiato tra i processi, come dicevo sopra, tutti i messaggi vengono inviati ricevuti e stampati correttamente, e nei messaggi è presente questo valore!
Spero possiate aiutarmi, vi ringrazio!

Rispondi quotando