Eddie1985
08-12-2011, 13:19
Salve a tutti, devo sviluppare un'applicazione client-server in C (che giri sotto un sistema UNIX-like); client e server devono comunicare tramite socket TCP.
Fra le altre cose questa applicazione deve svolgere la seguente operazione:
- il client spedisce un file al server, che lo riceve e lo memorizza in una directory
Il mio problema è proprio nello scambio di dati, quindi posto esclusivamente la parte di codice relativa lasciando perdere il resto. In particolare posterò l'operazione svolta da un mio amico (che funziona) e la mia soluzione (che non funziona: Segmentation fault), nella speranza che mi diciate perchè.
// soluzione non funzionante parte server
char *buff = NULL;
while (lunghezza_file > 0) {
recv (sock, (char *)buff, 1, 0);
fwrite (buff, 1, 1, fp);
}
//soluzione non funzionante parte client
char *buff = NULL;
while (!feof (fp)) {
fread (buff, 1, 1, fp);
send (sk, buff, 1, 0);
}
// soluzione funzionante parte server
char buff [1024];
int cont = 1;
while (lunghezza_file >= cont*1024) {
memset (buff, 0, 1024);
recv (sock, (char *)buff, 1024, 0);
fwrite (buff, 1, 1024, fp);
cont++;
}
if (lunghezza_file % 1024 > 0) {
recv (sock, buff, (lunghezza_file % 1024), 0);
fwrite (buff, 1, (lunghezza_file % 1024), fp);
}
// soluzione funzionante parte client
char buff [1024];
cont = 0;
while (!feof (fp)) {
fread (buff, 1, 1024, fp);
if ((info.st_size - cont*1024) >= 1024)
send (sk, buff, 1024, 0);
else
send (sk, buff, (info.st_size % 1024), 0);
cont++;
}
Vi ringrazio
Fra le altre cose questa applicazione deve svolgere la seguente operazione:
- il client spedisce un file al server, che lo riceve e lo memorizza in una directory
Il mio problema è proprio nello scambio di dati, quindi posto esclusivamente la parte di codice relativa lasciando perdere il resto. In particolare posterò l'operazione svolta da un mio amico (che funziona) e la mia soluzione (che non funziona: Segmentation fault), nella speranza che mi diciate perchè.
// soluzione non funzionante parte server
char *buff = NULL;
while (lunghezza_file > 0) {
recv (sock, (char *)buff, 1, 0);
fwrite (buff, 1, 1, fp);
}
//soluzione non funzionante parte client
char *buff = NULL;
while (!feof (fp)) {
fread (buff, 1, 1, fp);
send (sk, buff, 1, 0);
}
// soluzione funzionante parte server
char buff [1024];
int cont = 1;
while (lunghezza_file >= cont*1024) {
memset (buff, 0, 1024);
recv (sock, (char *)buff, 1024, 0);
fwrite (buff, 1, 1024, fp);
cont++;
}
if (lunghezza_file % 1024 > 0) {
recv (sock, buff, (lunghezza_file % 1024), 0);
fwrite (buff, 1, (lunghezza_file % 1024), fp);
}
// soluzione funzionante parte client
char buff [1024];
cont = 0;
while (!feof (fp)) {
fread (buff, 1, 1024, fp);
if ((info.st_size - cont*1024) >= 1024)
send (sk, buff, 1024, 0);
else
send (sk, buff, (info.st_size % 1024), 0);
cont++;
}
Vi ringrazio