Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
sono uno studente di ingegneria informatica e ho ultimato un progetto consistente nella realizzazione di un repository concorrente. Il problema è che non capisco come mai il codice di upload nel server (funzione upload_to_server) simmetrica alla download_from_server non mi funziona. E' esattamente lo stesso codice però la upload mi legge caratteri strani da una read in cui prendo la lunghezza del messaggio successivo. La cosa è ancora più strana in quanto se avvio il debugger DDD e vado di passo in passo il tutto funziona benissimo. Sono veramente disperato e la consegna del progetto per l'esame vicinissima. Spero che qualcuno di voi possa aiutarmi in breve tempo. Vi ringrazio fin da ora. Posto il codice della download_from server e upload_to_server lato server. L'errore si verifica sul server e sembrerebbe che il client scriva sul socket le cose giuste! Se vi servono altre informazioni non esitate a chidere.
void download_from_server(int sa){ //Questa funziona benissimo e non si blocca mai
struct tab_file *tb;
int sd=sa;
int len_string=0;
int ret=0;
int msg_len=0;
char aux[BUFFER_LEN];
memset(&aux,0,BUFFER_LEN);
char msg[BUFFER_LEN];
memset(&msg,0,BUFFER_LEN);
ret=read(sd,&msg_len,sizeof(msg_len));
if (ret!=sizeof(msg_len)){
printf("SERVER_DOWN: Error while getting msg_len from the client\n");
exit(1);
}
if(msg==NULL){
printf("SERVER: Can't get the heap\n");
exit(1);
}
ret=read(sd, msg, msg_len);
if(ret!=msg_len){
printf("SERVER_DOWN: Error while getting the msg from the client\n");
exit(1);
}
while(pthread_mutex_lock(&mutex));
int ris=ricerca_file(msg);
pthread_mutex_unlock(&mutex);
while(ris==2);
while(pthread_mutex_lock(&mutex));
crea_file(msg,strlen(msg));
pthread_mutex_unlock(&mutex);
printf("Elemento %s correttamente inserito (primo ciclo)\n",msg);
run_download(msg,sd);
while(pthread_mutex_lock(&mutex));
elimina_file(msg);
pthread_mutex_unlock(&mutex);
printf("Eliminazione file : %s riuscita\n",msg);
char terminazione[]="Fine";
while(1){
msg_len=0;
memset(&msg,0,BUFFER_LEN);
while(pthread_mutex_lock(&mutex));
read(sd,&msg_len,sizeof(msg_len));
read(sd,msg,msg_len);
if(strcmp(msg,terminazione)==0){
pthread_mutex_unlock(&mutex);
break;
}
pthread_mutex_unlock(&mutex);
while((ricerca_file(msg)==2));
while(pthread_mutex_lock(&mutex));
crea_file(msg,strlen(msg));
pthread_mutex_unlock(&mutex);
printf("Elemento %s correttamente inserito (dentro while)\n",msg);
run_download(msg,sd);
while(pthread_mutex_lock(&mutex));
elimina_file(msg);
pthread_mutex_unlock(&mutex);
printf("Eliminazione file : %s riuscita\n",msg);
}
printf("Elementi totali: %d\n",totale);
if(primo!=NULL)
printf("elemento sbagliato %s\n",primo->nomefile);
}
strncat(aux,path_file, strlen(path_file)+strlen(aux));
strncat(aux,nome_file,strlen(aux)+strlen(nome_file));
fp=fopen(aux,"rb");
if(fp==NULL){
printf("SERVER: Error can't open the file\n");
exit(1);
}
int size=get_filesize(aux);
char buf[DIM];
memset(buf,0,DIM);
write(sd,&size,sizeof(int));
while(size>0){
fread(buf,1,DIM,fp);
write(sd,buf,DIM);
size=size-DIM;
}
fclose(fp);
}
void upload_to_server(int sa){
struct tab_file *tb;
int sd=sa;
int len_string=0;
int ret=0;
int msg_len2=0;
char aux[DIM];
memset(&aux,0,DIM);
//char* aux=NULL;
char msg[BUFFER_LEN];
memset(&msg,0,BUFFER_LEN);
//char* p=NULL;
ret=read(sd,&msg_len2,sizeof(msg_len2));
if (ret!=sizeof(msg_len2)){
printf("SERVER_DOWN: Error while getting msg_len from the client\n");
exit(1);
}
//msg=calloc(msg_len,sizeof(char));
if(msg==NULL){
printf("SERVER: Can't get the heap\n");
exit(1);
}
ret=read(sd, msg, msg_len2);
printf("%s\n",msg);
if(ret!=msg_len2){
printf("SERVER_DOWN: Error while getting the msg from the client\n");
exit(1);
}
if(totale!=0){
tb=primo;
while(pthread_mutex_lock(&mutex));
crea_file(msg,strlen(msg));
for(tb;strcmp(msg,tb->nomefile)!=0;tb=tb->pun);
while(pthread_mutex_lock(&(tb->access)));
tb->shared=1;
pthread_mutex_unlock(&mutex);
run_upload(sd,msg);
pthread_mutex_unlock(&(tb->access));
printf("Upload eseguito di %s\n",msg);
while(pthread_mutex_lock(&mutex));
tb->shared=0;
elimina_file(msg);
printf("Eliminazione eseguito di %s\n",msg);
pthread_mutex_unlock(&mutex);
}
else {
while(pthread_mutex_lock(&mutex));
crea_file(msg,strlen(msg));
tb=primo;
for(tb;strcmp(msg,tb->nomefile)!=0;tb=tb->pun);
while(pthread_mutex_lock(&(tb->access)));
tb->shared=1;
pthread_mutex_unlock(&mutex);
run_upload(sd,msg);
pthread_mutex_unlock(&(tb->access));
printf("Upload eseguito di %s\n",msg);
while(pthread_mutex_lock(&mutex));
tb->shared=0;
elimina_file(msg);
printf("Eliminazione eseguito di %s\n",msg);
pthread_mutex_unlock(&mutex);
}
char terminazione[]="Fine";
printf("sono qui\n");
while(1){ // in questo while praticamente msg_len2 assume valore del tipo -511111423 che è totalmente errato in quanto dovrebbe avere al suo interno invece un semplice intero e ciò mi invalida anche la seconda read!!!
sono uno studente di ingegneria informatica e ho ultimato un progetto consistente nella realizzazione di un repository concorrente. Il problema è che non capisco come mai il codice di upload nel server (funzione upload_to_server) simmetrica alla download_from_server non mi funziona. E' esattamente lo stesso codice però la upload mi legge caratteri strani da una read in cui prendo la lunghezza del messaggio successivo. La cosa è ancora più strana in quanto se avvio il debugger DDD e vado di passo in passo il tutto funziona benissimo. Sono veramente disperato e la consegna del progetto per l'esame vicinissima. Spero che qualcuno di voi possa aiutarmi in breve tempo. Vi ringrazio fin da ora. Posto il codice della download_from server e upload_to_server lato server. L'errore si verifica sul server e sembrerebbe che il client scriva sul socket le cose giuste! Se vi servono altre informazioni non esitate a chidere.
Codice sorgente - presumibilmente C++
void download_from_server(int sa){//Questa funziona benissimo e non si blocca mai
struct tab_file *tb;
int sd=sa;
int len_string=0;
int ret=0;
int msg_len=0;
char aux[BUFFER_LEN];
memset(&aux,0,BUFFER_LEN);
char msg[BUFFER_LEN];
memset(&msg,0,BUFFER_LEN);
ret=read(sd,&msg_len,sizeof(msg_len));
if(ret!=sizeof(msg_len)){
printf("SERVER_DOWN: Error while getting msg_len from the client\n");
exit(1);
}
if(msg==NULL){
printf("SERVER: Can't get the heap\n");
exit(1);
}
ret=read(sd, msg, msg_len);
if(ret!=msg_len){
printf("SERVER_DOWN: Error while getting the msg from the client\n");
printf("SERVER_DOWN: Error while getting msg_len from the client\n");
exit(1);
}
//msg=calloc(msg_len,sizeof(char));
if(msg==NULL){
printf("SERVER: Can't get the heap\n");
exit(1);
}
ret=read(sd, msg, msg_len2);
printf("%s\n",msg);
if(ret!=msg_len2){
printf("SERVER_DOWN: Error while getting the msg from the client\n");
exit(1);
}
if(totale!=0){
tb=primo;
while(pthread_mutex_lock(&mutex));
crea_file(msg,strlen(msg));
for(tb;strcmp(msg,tb->nomefile)!=0;tb=tb->pun);
while(pthread_mutex_lock(&(tb->access)));
tb->shared=1;
pthread_mutex_unlock(&mutex);
run_upload(sd,msg);
pthread_mutex_unlock(&(tb->access));
printf("Upload eseguito di %s\n",msg);
while(pthread_mutex_lock(&mutex));
tb->shared=0;
elimina_file(msg);
printf("Eliminazione eseguito di %s\n",msg);
pthread_mutex_unlock(&mutex);
}
else{
while(pthread_mutex_lock(&mutex));
crea_file(msg,strlen(msg));
tb=primo;
for(tb;strcmp(msg,tb->nomefile)!=0;tb=tb->pun);
while(pthread_mutex_lock(&(tb->access)));
tb->shared=1;
pthread_mutex_unlock(&mutex);
run_upload(sd,msg);
pthread_mutex_unlock(&(tb->access));
printf("Upload eseguito di %s\n",msg);
while(pthread_mutex_lock(&mutex));
tb->shared=0;
elimina_file(msg);
printf("Eliminazione eseguito di %s\n",msg);
pthread_mutex_unlock(&mutex);
}
char terminazione[]="Fine";
printf("sono qui\n");
while(1){// in questo while praticamente msg_len2 assume valore del tipo -511111423 che è totalmente errato in quanto dovrebbe avere al suo interno invece un semplice intero e ciò mi invalida anche la seconda read!!!
//aux=(char*)malloc(10);
msg_len2=0;
memset(&msg,'\0',BUFFER_LEN);
read(sd,&msg_len2,sizeof(msg_len2));
printf("msg_len : %p %d\n",&msg_len2,msg_len2);
read(sd,msg,msg_len2);
printf("Sono qui : %d %s\n",msg_len2,msg);
if(strcmp(msg,terminazione)==0){
break;
}
if(totale!=0){
tb=primo;
while(pthread_mutex_lock(&mutex));
crea_file(msg,strlen(msg));
for(tb;strcmp(msg,tb->nomefile)!=0;tb=tb->pun);
while(pthread_mutex_lock(&(tb->access)));
tb->shared=1;
pthread_mutex_unlock(&mutex);
run_upload(sd,msg);
pthread_mutex_unlock(&(tb->access));
printf("Upload eseguito (dentro while) di %s\n",msg);
while(pthread_mutex_lock(&mutex));
tb->shared=0;
elimina_file(msg);
printf("Eliminazione eseguito (dentro while) di %s\n",msg);
pthread_mutex_unlock(&mutex);
}
else{
while(pthread_mutex_lock(&mutex));
crea_file(msg,strlen(msg));
tb=primo;
for(tb;strcmp(msg,tb->nomefile)!=0;tb=tb->pun);
pthread_mutex_lock(&(tb->access));
tb->shared=1;
pthread_mutex_unlock(&mutex);
run_upload(sd,msg);
pthread_mutex_unlock(&(tb->access));
printf("Upload eseguito (dentro while) di %s\n",msg);
while(pthread_mutex_lock(&mutex));
tb->shared=0;
elimina_file(msg);
printf("Eliminazione eseguito (dentro while) di %s\n",msg);
In effetti, io non posso aiutare tanto meno non ho capito nemmeno una h del codice xD.
E poi mi sembra di vedere che ha preso un progetto da un altro, e ha cercato di modificarlo a modo suo. Se fosse così, fa solo male.. MOLTO male ^^'. Altrimenti dimostra il contrario, e fai in modo che HeDo e netarrow ti capiscano e che possano aiutarti e non solo loro :|.
Ultima modifica effettuata da Lawliet il 19/07/2009 alle 17:10