Recv() e send() domanda

di il
2 risposte

Recv() e send() domanda

Salve a tutti,
ho una piccola domanda sulla send e recv.
Ho un semplice programma diviso in Client.c e Server.c e devo trasferire dei dati, non conoscendo la grandezza dei dati ho usato questo metodo:

-> metto i primi N dati in un Buffer
-> trasmetto la grandezza effettiva del Buffer
-> trasmetto il Buffer
-> ripeto fino alla fine del file

Detto questo ho notato che se applico questa tecnica da client a server non ci sono problemi mentre se lo faccio da server a client il trasferimento si blocca dopo pochi passaggi "andati a segno", leggendo cosa riceve il client nel campo lunghezza ho osservato che, dopo piu' o meno una 30ina di passi( non ricordo di preciso il numero ma e' praticamente fisso), si ha un valore completamente sbagliato e li ovviamente si creano problemi.

p.s. ho anche osservato che il valore della lunghezza inviata e' sempre giusto e che se il file e' piccolo ma cmq piu' grande dei 30 passi il problema non si verifica.
es. il file che invio e' di 300k ne ricevo uno di 28k
il file che invio e' di 70k lo ricevo correttamente

Puo' anche darsi che stia facendo un errore stupido oppure semplicemente c'e' un metodo migliore,
vi ringrazio anticipatamente per ogni informazione!

2 Risposte

  • Re: Recv() e send() domanda

    Detta così sembrerebbe che stai usando un'area di memoria sporca... forse stai accedendo a parti di memoria non allocata o al di fuori del buffer... se mandi stringhe forse non metti correttamente il terminatore (detta così è un pò difficile, se metti un pò di codice forse si capisce)
  • Re: Recv() e send() domanda

    Client:
    		fp = fopen("nome", "ab"); // 		TODO	PROBLEMA CON FOPEN
    		
    				if(fp){		
    		
    					int len = 0;
    
    					// Ciclo Bufferizzazione file
    
    					do{
    
    						// Ricezione lunghezza
    						if(recv(sk, (void *) &len, sizeof(int), 0) < 0){
    							printf("ERROR: recv(), %s\n",strerror( errno ));
    							exit(-1);
    						}
    					printf("%d\n",len);
    						// Ricezione Dato
    						if(recv(sk, (void *) buffer, len , 0) <0){
    							printf("ERROR: recv(), %s\n",strerror( errno ));
    							exit(-1);
    						}
    						fwrite(&buffer, 1 , len, fp);
    
    					}while(len == sizeof(buffer));
    				}
    				fclose(fp);
    
    Server:
    FILE *fp;
    					fp = fopen(path, "rb");
    
    					if(fp){	
    				
    						stat(path, &info);
    						int size = info.st_size;
    						int length;
    
    						// Ciclo bufferizzazione 
    						int count =0;
    						while(size > 0){
    							length = fread(&buffer, 1, sizeof(buffer), fp);
    						
    							size-=length;
    							// Invio lunghezza buffer
    					
    							if(send(rctab.cl_sk[index], (void *) &length, sizeof(int), 0) < 0){
    								printf("ERROR: send(), %s\n",strerror( errno ));
    								exit(0);
    							}
    							printf ("%d c: %d\n",length,count);
    							count++;
    							// Invio dato
    
    							if(send(rctab.cl_sk[index], (void *) &buffer, length ,0) < 0){
    								printf("ERROR: send(), %s\n",strerror( errno ));
    								exit(0);
    							}
    						}
    					}
    					fclose(fp);
    Risultato scritto dalla printf(len) del client:
    
    1024
    1024
    1024
    1024
    1024
    1024
    1024
    1024
    1024
    1024
    1024
    1024
    1024
    1024
    1024
    1024
    1024
    1024
    1024
    1024
    1024
    1024
    1024
    1024
    695943323
    
    mentre l'invio rimane sempre 1024 per il numero giusto di volte.

    p.s. per l'uscita dal ciclo c'e' un modo sicuramente migliore ma per adesso ho utilizzato questo per far presto

    spero sia di aiuto
Devi accedere o registrarti per scrivere nel forum
2 risposte