vv1984
27-10-2008, 13:09
Ciao a tutti,
ricevo attraverso un socket UDP una sequenza di pacchetti,
questi messaggi possono avere in generale 2 modelli diversi
(con dimensione diversa):
1- Primi 4 byte: ID (un numero progressivo maggiore di 0, un int)
Restanti 96 byte: payload vero e proprio.
(dimesione totale messaggio 100byte)
2- Primi 4 byte: ID (un numero negativo, sempre -1, un int)
Restanti 17 byte: altre informazioni.
(dimensioni totale messaggio 21byte)
Io ricevente leggo sempre i primi 4 per stabilire se il messaggio e' del primo o del secondo tipo. Il problema e' che qualcosa va storto nell'allineamento e mi ritrovo subito dopo la prima lettura a leggere valori completamente sballati.
(Ho gia' testato la mia applicazione senza il controllo preliminare sul tipo di messaggio, in quel caso non c'e' alcun problema, quindi il formato dei messaggio e' corretto ).
Provo a postarvi il codice nella speranza che qualcuno abbia gia' incontrato simili problematiche:
/* Funzione per leggere n byte da un buffer */
/* Input: file descriptor del socket, numero byte da leggere, puntatore al buffer dove memorizzarli*/
void readBuffer(int socketfd, long int len, char * buff)
{
int nread = 0;
int n = 0;
while(len > nread)
{
if ((n = read(socketfd, &(buff[nread]), len-nread )) == -1)
{
if(errno == EINTR)/* Mi ha fermato il SO e posso rifare la read()*/
{
/* rieseguo la read() con gli stessi parametri*/
}
else/* Verificato un altro errore e termino */
{
printf ("Errore read(): %d \"%s\"\n",errno,strerror(errno));
exit(1);
}
}
else if (n == 0)
{
exit(1);
}
else /* Read andata a buon fine ho letto qualcosa */
{
nread += n;
fflush(stdout);
}
}
}
/*Leggo i primi 4 byte (ID del messaggio) per vedere
che tipo di messaggio e'*/
readBuffer(socketfd, 4, &(buff[0]));
/*Controllo l'ID*/
if(*(int *)&buff[0] == -1)
{
readBuffer(socketfd, 1, &buff[0]+4);
}
else
{
readBuffer(socketfd, MESSAGE_LENGTH - 4, &buff[0]+4);
}
ricevo attraverso un socket UDP una sequenza di pacchetti,
questi messaggi possono avere in generale 2 modelli diversi
(con dimensione diversa):
1- Primi 4 byte: ID (un numero progressivo maggiore di 0, un int)
Restanti 96 byte: payload vero e proprio.
(dimesione totale messaggio 100byte)
2- Primi 4 byte: ID (un numero negativo, sempre -1, un int)
Restanti 17 byte: altre informazioni.
(dimensioni totale messaggio 21byte)
Io ricevente leggo sempre i primi 4 per stabilire se il messaggio e' del primo o del secondo tipo. Il problema e' che qualcosa va storto nell'allineamento e mi ritrovo subito dopo la prima lettura a leggere valori completamente sballati.
(Ho gia' testato la mia applicazione senza il controllo preliminare sul tipo di messaggio, in quel caso non c'e' alcun problema, quindi il formato dei messaggio e' corretto ).
Provo a postarvi il codice nella speranza che qualcuno abbia gia' incontrato simili problematiche:
/* Funzione per leggere n byte da un buffer */
/* Input: file descriptor del socket, numero byte da leggere, puntatore al buffer dove memorizzarli*/
void readBuffer(int socketfd, long int len, char * buff)
{
int nread = 0;
int n = 0;
while(len > nread)
{
if ((n = read(socketfd, &(buff[nread]), len-nread )) == -1)
{
if(errno == EINTR)/* Mi ha fermato il SO e posso rifare la read()*/
{
/* rieseguo la read() con gli stessi parametri*/
}
else/* Verificato un altro errore e termino */
{
printf ("Errore read(): %d \"%s\"\n",errno,strerror(errno));
exit(1);
}
}
else if (n == 0)
{
exit(1);
}
else /* Read andata a buon fine ho letto qualcosa */
{
nread += n;
fflush(stdout);
}
}
}
/*Leggo i primi 4 byte (ID del messaggio) per vedere
che tipo di messaggio e'*/
readBuffer(socketfd, 4, &(buff[0]));
/*Controllo l'ID*/
if(*(int *)&buff[0] == -1)
{
readBuffer(socketfd, 1, &buff[0]+4);
}
else
{
readBuffer(socketfd, MESSAGE_LENGTH - 4, &buff[0]+4);
}