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.
in pratica memcpy si blocca lì, visto che la printf subito prima viene eseguita mentre quella dopo no.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); }

Rispondi quotando