Salve a tutti! Per un progetto di Sistemi Operativi dobbiamo implementare una chat in Linux e di conseguenza un marshaller del buffer approppriato.
Ora questo sembra lavorare abbastanza bene, ma tende a tagliare gli ultimi 1-2 caratteri del messaggio, indifferentemente da quanto sia lungo questo. La struttura da marshallare comprende il tipo di messaggio da inviare, il mittente, il destinatario, la lunghezza del messaggio e il messaggio stesso. Specifico che il marshalling funziona perfettamente come si può vedere dalla stampa che il programma esegue (noterete che a numero uguale corrisponde carattere uguale). Quindi il problema è da ricercarsi nel demarshalling.
Includo sia la libreria che il relativo client.
LIBRERIA PROTOCOL.H
CLIENT PROTOCOL_CLIENT.Ccodice:#ifndef _PROTOCOL #define _PROTOCOL #include <sys/types.h> #include <netinet/in.h> #include <string.h> #include <stdlib.h> #include <stdio.h> #define MSG_LOGIN 'L' /* login */ #define MSG_REGLOG 'R' /* registrazione e login */ #define MSG_OK 'O' /* ok */ #define MSG_ERROR 'E' /* errore */ #define MSG_SINGLE 'S' /* messaggio a singolo utente */ //ok #define MSG_BRDCAST 'B' /* messaggio a tutti */ //ok #define MSG_LIST 'I' /* lista */ //ok #define MSG_LOGOUT 'X' /* logout */ //ok #define MAX_LUNGHEZZA 256 typedef struct{ char type; /* tipo di messaggio */ char *sender; /* mittente */ char *receiver; /* destinatario */ unsigned int msglen; /* lunghezza */ char *msg; /* buffer */ } msg_t; u_short * MARSHALLING(msg_t); msg_t DEMARSHALLING(u_short *); u_short * MARSHALLING(msg_t msg){ u_short * buffer; int c=0; int i=0; buffer = (u_short *) malloc(sizeof(u_short)*(msg.msglen+strlen(msg.sender)+strlen(msg.receiver))); buffer[c] = htons(msg.type); c++; buffer[c] = htons(strlen(msg.sender)); c++; for(i=0;i<strlen(msg.sender);i++, c++) buffer[c] = htons(msg.sender[i]); buffer[c] = htons(strlen(msg.receiver)); c++; for(i=0;i<strlen(msg.receiver);i++, c++) buffer[c] = htons(msg.receiver[i]); buffer[c] = htons(msg.msglen); printf("La lunghezza del messaggio è %d\n", msg.msglen); c++; for(i=0;i<msg.msglen;i++, c++) buffer[c] = htons(msg.msg[i]); return buffer; } msg_t DEMARSHALLING(u_short * buffer){ msg_t mex; int i=0, c=0; mex.type=ntohs(buffer[c]); c++; int lunghezza_sender=ntohs(buffer[c]); mex.sender = (char *) malloc(sizeof(char)*lunghezza_sender); c++; for(i=0;i<lunghezza_sender;i++,c++) mex.sender[i] = ntohs(buffer[c]); int lunghezza_receiver=ntohs(buffer[c]); mex.receiver=(char *) malloc(sizeof(char)*lunghezza_receiver); c++; for(i=0;i<lunghezza_receiver;i++,c++) mex.receiver[i] = ntohs(buffer[c]); mex.msglen = ntohs(buffer[c]); printf("La lunghezza del messaggio è %d\n", mex.msglen); mex.msg = (char*) malloc(sizeof(char)*mex.msglen); c++; for(i=0;i<mex.msglen;i++,c++) mex.msg[i] = ntohs(buffer[c]); return mex; } #endif
codice:#include <stdio.h> #include <string.h> #include <sys/types.h> #include <stdlib.h> #include <netinet/in.h> #include "protocol.h" int main(){ int i; msg_t mex; char * mittente=(char*)malloc(sizeof(char)*256); char * destinatario=(char*)malloc(sizeof(char)*256); char * messaggio=(char*)malloc(sizeof(char)*256); strcpy(mittente, "bimbo1989"); strcpy(destinatario, "tromb35"); strcpy(messaggio, "Ciao Mattia! Sono bello e sexy! LOL!"); mex.sender = (char *) malloc(sizeof(char)*strlen(mittente)); mex.receiver = (char*) malloc(sizeof(char)*strlen(destinatario)); mex.msg = (char *) malloc(sizeof(char)*strlen(messaggio)); mex.type = MSG_SINGLE; strcpy(mex.sender, mittente); strcpy(mex.receiver, destinatario); strcpy(mex.msg, messaggio); mex.msglen = strlen(mex.msg); u_short * marshallato; marshallato = MARSHALLING(mex); for(i=0;marshallato[i]!=0;i++) printf("%d\n", marshallato[i]); msg_t prova = DEMARSHALLING(marshallato); printf("%s\n", prova.sender); printf("%s\n", prova.receiver); printf("%s\n", prova.msg); return 0; }


Rispondi quotando