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.
codice:
typedef struct {
/** tipo del messaggio */
char type;
/** lunghezza messaggio in byte */
unsigned int length;
/** buffer messaggio */
char buffer[MAXBUF];
} message_t;
Il messaggio inviato viene impacchettato in un buffer costituito in questo modo:
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;
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:
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:
codice:
printMessage(message_t*msg){
if ( msg->length == 0 ) {
printf("%c : <void>\n", msg->type);
return;
}
printf("%c : %s\n", msg->type,msg->buffer);
}
Il problema è che il campo lenght contiene un valore numerico in formato macchina, dunque la condizione msg->length == 0 risulta sempre vera.
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!