NON RIESCO A FARE UN DOWNLOAD IN C.ORA VI POSTO IL MIO CLIENT E IL MIO SERVER..SPERO DI RICEVERE AL PIU PRESTO UN AIUTO.GRAZIE

SERVER

#include <pthread.h> //libreria per i pthread

#include <sys/types.h> //libreria per i tipi di dato non standard

#include <sys/socket.h> //libreria per le socket

#include <netinet/in.h> //libreria per le informazioni sul socket

#include <arpa/inet.h> //libreria per la conversione di indirizzi

#include <errno.h> //libreria per gli errori

#include <stdio.h> //libreria standard input output

#include <stdlib.h> //libreria standar

#include <unistd.h>

#include <string.h>//libreria per le stringhe

#include <sys/stat.h>
#include <fcntl.h>



#define SERV_PORT 3031 //numero di porta utilizzata

#define BACKLOG 10 // numero massimo di client che possono accodarsi

#define MAXLINE 500// massima lunghezza della stringa









/* Prototipi delle funzioni */





void *doit(void *arg); // funzione esaguita dal thread







int main(int argc, char **argv)



{



/* Controllo del numero di parametri passati all'inizio*/

if(argc != 1)

{

fprintf(stderr, "Sono stati passati troppi argomenti.\n");

exit(1);

}





pthread_t tid; //identificatore del thread

struct sockaddr_in servaddr; // struttura dati rappresentante il socket

int listensd, connsd, n; //dichiarazione variabili





/* creazione del socket */

if((listensd = socket(AF_INET, SOCK_STREAM, 0)) < 0)

{

fprintf(stderr, "Errore nella creazione del socket.\n");

exit(1);

}



memset((void *)&servaddr, 0, sizeof(servaddr)); // azzeramento della struttura dati

servaddr.sin_family = AF_INET; //AF_INET per il protocollo internet IPv4

servaddr.sin_addr.s_addr = htonl(INADDR_ANY); // accetta connessione con chiunque

servaddr.sin_port = htons(SERV_PORT); // setta la porta su cui si metta in ascolto





/*La funzione bind assegna un indirizzo locale ad un socket.*/

if((bind(listensd, (struct sockaddr *) &servaddr, sizeof(servaddr))) < 0)

{

fprintf(stderr, "Errore nella funzione bind().\n");

exit(1);

}





/* si mette in ascolto sulla socket */

if(listen(listensd, BACKLOG) < 0 )

{

fprintf(stderr, "Errore nella funzione listen().\n");

exit(1);

}



/* ciclo infinito nel quale il server accetta le connessioni, e le fa eseguire dai thread */

while(1)

{



/* accetta la connessione */

if((connsd = accept(listensd, NULL, NULL)) < 0)

{

fprintf(stderr, "Errore nella funzione accept().\n");

exit(1);

}



/* creazione thread */

if((n = pthread_create(&tid, NULL, &doit, (void *)connsd)) != 0)

{

errno = n;

fprintf(stderr, "Errore nella creazione del thread.\n");

exit(1);

}

}



return 0;



}





/* Definizione della funzione doit() */

void *doit(void *arg)

{

int sockfd = (int) arg; // è necessario effettuare il casting poichè la pthread_create()

// vuole un puntatore void, mentre l'dentificatore del socket è un

// intero.

int n=0,fd,ln,i; // utilizzata per contare il numero di byte inviati dal client al socket



char buffer[MAXLINE];

char file[MAXLINE]; // dove verrà memorizzata data e ora

time_t timeval;

FILE * fp;

/* La funzione pthread_detach() rende il figlio indipendente dal thread padre.Non */

if((n = pthread_detach(pthread_self())) != 0)

{

errno = 0;

fprintf(stderr, "Errore nella funzione pthread_detach()");

exit(1);

}










/* Qui ho fatto un ciclo do-while() nel ricevo la stringa passata dal client e effettuo un controllo

per vedere se non è arrivata la strings "exit".Se la stringa non è "exit" allora

capitalizzo la stringa inviata , la salvo sul file e la rinvio al client */







fd=open("prova.txt",O_RDONLY);
if(fd == -1)
printf("errore");
else{
printf("apro il file in lettura\n",file);
while(n=read(fd,buffer,MAXLINE)!=0){
printf("entro");

send(sockfd,buffer,MAXLINE,0);

}



close(fd);

return NULL;

}

}


--------------------------------------------------------------------------------------

CLIENT



//librerie

#include <stdio.h>//sta per "standard input-output header", è l'header file della libreria standard del C che contiene definizioni di macro, costanti e dichiarazioni di funzioni e tipi usati per le varie operazioni di input/output.

#include <stdlib.h>//stdlib.h è l'header file che, all'interno della libreria standard del C, dichiara funzioni e costanti di utilità generale

#include <string.h>//libreria per l'utilizzo delle stringhe

#include <arpa/inet.h>//libreia per la conversione degli indirizzi

#include <sys/types.h>//libreria per tipi di dato non standard

#include <sys/socket.h>//libreria per le socket



#define BUFFER_SIZE 500



int sockfd;



int n;

int addrSize;

int serverPort = 3031; //porta utilizzata

char serverIP[] = "127.0.0.1"; // indirizzo server

char buffer[BUFFER_SIZE];

char file[BUFFER_SIZE];

struct sockaddr_in serverAddr;// struttura dati rappresentante il socket

//composta da sin_family,sin_port,sin_addr



int main(int argc, char* argv[])

{

FILE *fp,*fpp;

addrSize = sizeof(struct sockaddr);



/* Creazione del socket */

sockfd = socket(AF_INET, SOCK_STREAM, 0);



if(sockfd < 0)

printf("Errore nella creazione del socket");



serverAddr.sin_family = AF_INET;//assegna il tipo di indirizzo

serverAddr.sin_port = htons(serverPort); /* Porta del server */

inet_pton(AF_INET, serverIP, &serverAddr.sin_addr); /* Indirizzo IP del server */

memset(&(serverAddr.sin_zero), '\0', 8); // azzeramento struttura dati



/* Connessione al server */

if(connect(sockfd, (struct sockaddr*)&serverAddr, addrSize) != 0)

{

printf("Errore: impossibile connettersi a %s\n", serverIP);

exit(0);

}

else

printf("Connesso a %s con la porta %d\n\n", serverIP, serverPort);







/*viene aperto il file prova1.txt viene effettuata una lettura parola per parola e inviate al server.

Il server dopo averle capitalizzate,le visualizza a video , le salva su un file e le rispiedisce al client che le visualizza.

*/


memset(buffer, '\0', BUFFER_SIZE);
fp=fopen("scarico.txt","w");
if(fp==NULL){
printf("errore");
}
while(n =read(sockfd, buffer, strlen(buffer))){//azzero la variabile buffer

//n = recv(sockfd, buffer, BUFFER_SIZE, 0); //riceve la parola e la mette in buffer

fprintf(fp,"%s ",buffer);
printf("%s",buffer);}
fclose(fp);
printf("fatto");



//chiusura file prova1.txt



//finito di leggere il file viene inviato al server la parola exit per fa si che il server esca dal ciclo.



close(sockfd); //chiusura socket

return 0;

}