Ciao ragazzi ho scritto questi 2 sorgenti per un Client e un Server che implementano download server-client e upload client-server di alcuni file di testo .doc
il problema è che mentre l'operazione Upload mi funziona correttamente (anche se copia il file in maniera un po' sporca e vorrei ripulirlo) quella Download invece non effettua nessuan copia file anche se ne crea uno nuovo vuoto.
ma non riesco a capire dove sbaglio, il codice mi sembra corretto,
PLEASE AIUTATEMI SONO DISPERATO E' PER UN ESAME!!!!
Allego sorgenti
GRAZIE A CHIUNQUE MI AIUTI
codice:
/*client.c*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h> /*sockaddr_in*/
#include <unistd.h> /*read,write,close*/
#include <errno.h>
#include <string.h>
#include <fcntl.h> /*gestione file*/
#define PORT 5000
#define SERVER_IP "127.0.0.1"
char sceltaOperazioneClient (int sock);
char *sceltaFileDownload(int sock);
void invioFileDownload(int sock, char *titoloFile);
char *sceltaFileUpload(int sock);
void ricezioneFileUpload(int sock, char *nomefile);
int main(){
int sock,err, fd,nread;
struct sockaddr_in server;
char buffer[1024], opScelta,bufferlettura[1024],clear, *titoloFile;
int scelta;
char *titoloFileDownload, *titoloFileUpload, *nomeFileUpload,*nomefile, *nomefilescelto;
/*indicazioni del server*/
server.sin_family=AF_INET;
/*IP da formato dotted a network*/
inet_pton(AF_INET,SERVER_IP,&server.sin_addr);
/*da short a big endian*/
server.sin_port = htons(PORT);
/*creazione di una socket*/
sock=socket(AF_INET,SOCK_STREAM,0);
if (sock<0){
perror("socket");
exit(1);
} else {
printf("Client: Socket creata\n");
}
/*richiesta di connessione*/
err = connect(sock,(struct sockaddr*)&server,sizeof(server));
if (err<0){
perror("connect");
exit(1);
}
opScelta=sceltaOperazioneClient(sock);
switch(opScelta){
case 'd':
titoloFileDownload=sceltaFileDownload(sock);
invioFileDownload(sock,titoloFileDownload);
break;
case 'u':
titoloFileUpload=sceltaFileUpload(sock);
ricezioneFileUpload(sock, titoloFileUpload);
break;
default:
printf("Impossibile");
break;
}
close(sock);
}
/****FUNZIONI DOWNLOAD *****/
char sceltaOperazioneClient (int sock)
{
char buffer[1024],scelta;
memset(buffer, 0, sizeof(buffer)); /*puliamo il buffer*/
/*leggiamo e stampiamo il buffer per la scelta tra download e upload*/
read(sock,buffer,sizeof(buffer)); //legge messaggio di scelta up down
printf("%s\n",buffer);
/*alla richiesta del server digitiamo la nostra scelta
e la inviamo al server*/
scelta=fgetc(stdin);
write(sock,&scelta,sizeof(scelta)); //invia scelta al server
return scelta;
}
char *sceltaFileDownload(int sock)
{
char buffer[1024],scelta,clear, *titolo;
read(sock,buffer,sizeof(buffer)); //legge elenco ricevuto da server
printf("%s\n",buffer); //stampa elenco su client
clear = '\n';
scanf("%c",&clear);
scelta=fgetc(stdin); //input da tastiera della scelta
write(sock,&scelta,sizeof(scelta)); //invio scelta al server
memset(buffer, 0, sizeof(buffer));
printf("\n hai scelto di scaricare il seguente file: ");
read(sock,buffer,sizeof(buffer)); //nome del file scelto, reinviato da server
printf("%s \n\n\n",buffer); //stampa nome file scelto
titolo=buffer;
return titolo;
}
void invioFileDownload(int sock, char *titoloFile)
{
char bufferlettura[1024],scelta,nread;
int fd;
/*creiamo un file con tutti i permessi con il nome contenuto nel buffer*/
fd = open(titoloFile, O_CREAT | O_WRONLY,0700);
if (fd < 0) {
perror("open");
exit(1);
}else
{
printf("Ho creato il file: %s \n\n",titoloFile);
}
while ((nread = read(sock, bufferlettura, sizeof(bufferlettura))) != 0) {
// e li memorizza sul file
write(fd, bufferlettura, nread);
memset(bufferlettura,0,sizeof(bufferlettura));
}
printf("\n download avvenuto con successo\n");
close(fd);
}
/*******************FUNZIONI UPLOAD X CLIENT************************/
char *sceltaFileUpload(int sock)
{
int scelta;
char *nomefile, *elenco[4]={"catullo.doc","lorca.doc","nonloso.doc","bhooo.doc"};
printf("\nElenco File su Client\n[1]catullo.doc\n[2]lorca.doc\n[3]nonloso.doc");
scanf("%d",&scelta);
scelta=scelta-1;
printf("\n\nscelta = %d\n\n",scelta);
nomefile=elenco[scelta];
printf("\n Si vuole caricare il file %s in Upload da Client a Server\n\n",nomefile);
write(sock, nomefile,strlen(nomefile));
sleep(10);
return nomefile;
}
void ricezioneFileUpload(int sock, char *nomefile)
{
int fileUp, nread;
char buffer[1024];
fileUp = open(nomefile, O_RDONLY);
if (fileUp < 0) {
perror("open");
exit(1);
}
fflush(stdin);
memset(buffer,0,sizeof(buffer));
/* finchè il file non è finito,legge sizeof(buffer) byte e li bufferizza */
fflush(stdin);
while ((nread = read(fileUp, buffer, sizeof(buffer))) != 0)
{
//una volta bufferizzati, li inviamo al client
write(sock, buffer, sizeof(buffer));
memset(buffer,0,sizeof(buffer));
}
printf("\n upload avvenuto con successo\n");
close(fileUp);
}
Lato Server
codice:
/* server.c */
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h> /*sockaddr_in*/
#include <unistd.h> /*read,write,close*/
#include <errno.h>
#include <string.h>
#include <fcntl.h> /*gestione file*/
#define PORT 5000
#define CONNMAX 10
char sceltaOperazioneClient(int sock);
int sceltaFileDownload(int sock);
char* ricercaFileDownload(int fscelto,int sock);
void invioFileDownload(char* nomefilescelto,int sock);
char *sceltaFileUpload(int sock);
void ricezioneFileUpload(int sock, char *titoloFile);
int main(){
int sock,newsock,err,pid, nread;
struct sockaddr_in server;
int fscelto, fd;
char *fileDownload,scelta;
char buffer[1024], bufferlettura[1024];
char *nomFile, *titoloFileUpload;
/*creiamo la socket e memorizziamo in sock il descriptor*/
/*AF_INET:ipv4*/
sock=socket(AF_INET,SOCK_STREAM,0);
if (sock<0){
perror("socket");
exit(1);
} else {
printf("Socket creata\n");
}
/*assegniamo indirizzo e porta*/
server.sin_family=AF_INET;
server.sin_addr.s_addr= INADDR_ANY;
/*converte in big endian uno short*/
server.sin_port = htons(PORT);
/*assegna a sock i parametri del server*/
err = bind(sock,(struct sockaddr*) &server,sizeof(server));
if (err<0){
perror("bind");
exit(1);
}
/*la socket in ascolto*/
err=listen(sock,CONNMAX);
if (err<0){
perror("listen");
exit(1);
} else {
printf("socket in ascolto\n");
}
/*********************************************************************************************/
while(1){
/*la socket accetta la richiesta di connessione dal Client*/
/*il secondo e il terzo parametro identificano il client e possono essere NULL*/
newsock=accept(sock,NULL,NULL);
if (newsock<0){
perror("accept");
exit(1);
} else { printf("Server: connessione accettata\n");
}
/*creiamo un processo figlio*/
if((pid=fork())==0){
close(sock); /*il processo figlio libera la sock e usa newsock*/
scelta=sceltaOperazioneClient(newsock);
switch (scelta) {
case 'd':
fscelto=sceltaFileDownload(newsock);
fileDownload=ricercaFileDownload(fscelto,newsock);
invioFileDownload(fileDownload,newsock);
break;
case 'u':
titoloFileUpload=sceltaFileUpload(newsock);
ricezioneFileUpload(newsock,titoloFileUpload);
break;
default:
("!!! Impossibile effettuare Scelta dell'Operazione da Eseguire !!!\n\n");
break;
}
}
/*il processo padre chiude newsock*/
close(newsock);
}
/********************************END WHILE**************************************/
}
/*in ingresso la sock in uscita il numero del file scelto*/
int sceltaFileDownload(int sock){
char scelta;
int fscelto;
char *buffer;
buffer = "Elenco Poeti:\n[1]dante.doc\n[2]leopardi.doc\n[3]catullo.doc\n[4]d_annunzio.doc\ninserire il numero desiderato: ";
/*inviamo l'elenco al client*/
write(sock,buffer,strlen(buffer)+1);
/*leggiamo la scelta del client*/
read(sock,&scelta,sizeof(scelta));
/*essendo la scelta un char ne ricaviamo il numero corrispondente
sottraendo 48 che equivale a 0
e sottraendo 1 per ricondurci agli indici dell'array*/
fscelto = (scelta - 48)-1;
return (fscelto);
}
/* in ingresso il numero del file scelto e la sock*/
char* ricercaFileDownload(int fscelto,int sock){
int fd,nread;
char *elenco[4]={"dante.doc","leopardi.doc","catullo.doc","d_annunzio.doc"};
char buffer[1024],*nomefile;
nomefile = elenco[fscelto];
/*confermiamo al client il nome del file scelto*/
printf("Il client sta provando a scaricare: %s\n",nomefile);
write(sock,nomefile,strlen(nomefile));
sleep(10);
return nomefile;
}
void invioFileDownload(char* nomefilescelto,int sock){
int fd,nread;
char buffer[1024];
printf("sto inviando il contenuto di : %s\n",nomefilescelto);
/*apriamo il file in modalitÃ_ lettura*/
fd = open(nomefilescelto, O_RDONLY);
if (fd < 0) {
perror("open");
exit(1);
}fflush(stdin);
memset(buffer,0,sizeof(buffer));
/* finchè il file non è finito,legge sizeof(buffer) byte e li bufferizza */
fflush(stdin);
while ((nread = read(fd, buffer, sizeof(buffer))) != 0)
{
//una volta bufferizzati, li inviamo al client
write(sock, buffer, sizeof(buffer));
memset(buffer,0,sizeof(buffer));
}
close(fd);
}
char sceltaOperazioneClient(int sock){
char scelta;
int fscelto;
char *buffer;
buffer = "scegli (d) per scaricare un file oppure (u) per caricare un file ";
/*inviamo l'elenco al client*/
write(sock,buffer,strlen(buffer)+1);
/*leggiamo la scelta del client*/
read(sock,&scelta,sizeof(scelta));
return (scelta);
}
/************************FUNZIONI UPLOAD X SERVER***************************************/
char *sceltaFileUpload(int sock)
{
char *titoloFile, buffer[1024];
read(sock,buffer,sizeof(buffer)); //nome del file scelto, reinviato da server
titoloFile=buffer;
printf("Stai tentando di caricare il file [ %s ] da Client a Server\n\n",titoloFile); //stampa nome file scelto
/*creiamo un file con tutti i permessi con il nome contenuto nel buffer*/
return titoloFile;
}
void ricezioneFileUpload(int sock, char *titoloFile)
{
char buffer[1024], bufferlettura[1024];
int fileUp,nread;
fileUp = open(titoloFile, O_CREAT | O_WRONLY,0700);
if (fileUp < 0) {
perror("open");
exit(1);
}else
{
printf("Ho creato il file: %s \n\n",titoloFile);
}fflush(stdin);
memset(bufferlettura, 0, sizeof(bufferlettura));
/* il buffer riceve i byte */
fflush(stdin);
while ((nread = read(sock, bufferlettura, sizeof(bufferlettura))) != 0) {
// e li memorizza sul file
write(fileUp, bufferlettura, nread);
memset(bufferlettura, 0, sizeof(bufferlettura));
}
printf("\n upload avvenuto con successo\n");
close(fileUp);
}