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;
}