Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    download di un file .comunicazione client server con socket in c

    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;

    }

  2. #2
    Devi specificare qual è il problema, magari evitando di usare il caps lock, definendo qualcosa di meno generico
    devi specificare quali errori ti restituisce e se hai o meno dei warning del compilatore
    devi racchiudere il codice tra i tag [code] assicurandoti che sia ben indentato in modo da risultare comprensibile

  3. #3

    Re: download di un file .comunicazione client server con socket in c

    Originariamente inviato da gianni19899

    #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
    commenti inutili non credi? poi non sono neppure delle "librerie" bensì degli header.

    (ps. usa i tag code e descrivi bene il tuo problema)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.