posto sia la struttura con cui lavora la mia funzione,sia il codice della funzione stessa.
check201 viene chiamata all'interno di una funzione che subito prima aveva fatto una recv. plen è il numero di byte ricevuti dalla recv appunto.
codice:
struct ResponseGet{
char buf[MAXLENREQ];
//int LenRange;
int expire;
char dati[MAXLENREQ];
struct Range range;
};
static int check201(struct ResponseGet *pris, int *plen){
printf("\n sono nella check201\n");
printf("plen vale:%d\n",*plen);
if(*plen<1) return(0); /* leggere ancora perchè SIMULO ERRORE */
if(*plen>=1)
if(pris->buf[0]!='2')
return(-1);
if(*plen>=2)
if(pris->buf[1]!='0')
return(-1);
if(*plen>=3)
if(pris->buf[2]!='1')
return(-1);
if(*plen>=4)
if(pris->buf[3]!='\n')
return(-1);
if(*plen>=5)
if(pris->buf[4]!='R')
return(-1);
if(*plen>=6)
if(pris->buf[5]!='a')
return(-1);
if(*plen>=7)
if(pris->buf[6]!='n')
return(-1);
if(*plen>=8)
if(pris->buf[7]!='g')
return(-1);
if(*plen>=9)
if(pris->buf[8]!='e')
return(-1);
if(*plen>=10)
if(pris->buf[9]!=' ')
return(-1);
if(*plen>=11) {
int ris, len2, len3, len4, valuerange;
char str[1024];
ris=sscanf(pris->buf+10, "%i", &len2);/* cerco il valore di inizio del range */
if(ris!=1) return(-1); /* errato, ci sono caratteri ma non e' numero */
if( len2<0 ) return(-1); /* errato, len negativo */
pris->range.first=len2;/* metto il valore di inizio del range */
valuerange=len2;
sprintf(str, "%i", len2);
len2=11+strlen(str);
if(*plen>=len2){
if(pris->buf[len2-1]!='-')
return(-1);
}
ris=sscanf(pris->buf+len2+1-1, "%i", &len3);/* cerco il valore di fine del range */
if(ris!=1) return(-1); /* errato, ci sono caratteri ma non e' numero */
if( len3<0 ) return(-1); /* errato, len negativo */
pris->range.last=len3;/* metto il valore di fine del range */
valuerange=(pris->range.last-pris->range.first)+1;/* +1 perchè estremi compresi */
sprintf(str, "%i", len3);
len3=len2+strlen(str)+1;
printf("valuerange è :%d\n",valuerange);
printf("il range first è:%d\n",pris->range.first);
printf("il range last è:%d\n",pris->range.last);
printf("quel valore è%s\n",pris->buf+len3+1-1);
if(*plen>=len3){
if(pris->buf[len3-1]!='\n')
return(-1);
}
/* cerco se c'e' Expire xxxx\n */
if(*plen>=len3+1)
if(pris->buf[len3+1-1]!='E')
return(-1);
if(*plen>=len3+2)
if(pris->buf[len3+2-1]!='x')
return(-1);
if(*plen>=len3+3)
if(pris->buf[len3+3-1]!='p')
return(-1);
if(*plen>=len3+4)
if(pris->buf[len3+4-1]!='i')
return(-1);
if(*plen>=len3+5)
if(pris->buf[len3+5-1]!='r')
return(-1);
if(*plen>=len3+6)
if(pris->buf[len3+6-1]!='e')
return(-1);
if(*plen>=len3+7)
if(pris->buf[len3+7-1]!=' ')
return(-1);
if(*plen<len3+7+1)
return(0);
ris=sscanf(pris->buf+len3+7, "%i", &len4);
if(ris!=1) return(-1); /* errato, ci sono caratteri ma non e' numero */
if(len4<0) return(-1); /* errato, len negativo */
pris->expire=len4;
sprintf(str,"%i", len4);
/* cerco il carattere successivo alla fine del numero trovato */
len3= len3 + 8 + strlen(str);
/* controllo se c'e' l' EOL */
if(*plen>=len3)
if(pris->buf[len3-1]!='\n')
return(-1);
/* cerco la fine del messaggio */
if(*plen>=(len3+1))
if(pris->buf[len3+1-1]!='\n')
return(-1);
/* vedo se il n di bytes ricevuti è minore di quello che mi aspettavo in totale */
if(*plen<(len3+1+valuerange))
return(0);
printf("printf di prova\n");
/* copio nel buffer destinazione i dati allegati nel messaggio 200 */
memcpy( & (buffer[pris->range.first-1]) , pris->buf+len3+1 , valuerange );
printf("il buffer riempito è:%s\n",buffer[pris->range.first]);
}
return(1);
}
in pratica memcpy si blocca lì, visto che la printf subito prima viene eseguita mentre quella dopo no.