Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 26
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    15

    [C] Invio immagine al client con socket

    Ciao a tutti !!
    ho urgente bisogno di aiuto..dovrei inviare un file di immagine da un server ad un client..ma nn so proprio cm venirne fuori potreste aiutarmi!!grazie
    questo è il codice del server


    #include "basic.h"

    void server_func(int sockfd);

    int main(int argc, char **argv) {
    pid_t childpid;
    int listenfd, connfd;
    struct sockaddr_in servaddr, cliaddr;
    socklen_t cliaddr_len;

    if( argc != 2){
    printf("Usage: echosrv <PORT> \n"); exit(1);
    }

    if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    { printf("socket error\n"); exit(1); }

    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY); /* wildcard address */
    servaddr.sin_port = htons(atoi(argv[1])); /* echo server */

    if( (bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr))) < 0)
    { printf("bind error\n"); exit(1); }

    if( listen(listenfd, 5) < 0 )
    { printf("listen error\n"); exit(1);}

    for ( ; ; ) {
    cliaddr_len = sizeof(cliaddr);
    if( (connfd = accept(listenfd, (struct sockaddr *) &cliaddr, &cliaddr_len)) < 0)
    { printf("accept error\n"); exit(1); }

    if( (childpid = fork()) == 0 ) {
    close(listenfd);
    server_func(connfd); /* svolge tutto il lavoro del server */
    exit(0);
    }

    close(connfd);
    }
    }

    void server_func(int sockfd) {
    ssize_t n;
    char line[MAXLINE], nomefile[MAXLINE], line2[MAXLINE], i[5],prova[MAXLINE];
    FILE *fp;
    int j,size;
    char buffer[MAXLINE];

    for ( ; ; ) {
    if ( (n = reti_readline(sockfd, nomefile, MAXLINE)) == 0)
    return; /* connection closed by other end */
    for(j=0; nomefile[j]!='\n'; j++)
    ;
    nomefile[j]='\0';
    sprintf(prova, "%s.jpg",nomefile);
    if((fp=fopen(prova, "r"))==NULL){
    printf("File non esistente\n");
    sprintf(i, "%d\n", -1);
    reti_writen(sockfd, i, strlen(i));
    }
    else{
    printf("Eccomi\n");
    fseek(fp,0,SEEK_END);
    size=ftell(fp);
    fseek(fp,0,SEEK_SET);

    sprintf(i, "%d\n", size);
    reti_writen(sockfd, i, strlen(i));
    printf("size %d\n",size);
    bzero(buffer,1);
    while (size>0)
    {
    fgets(buffer,MAXLINE,fp);
    reti_writen(sockfd,buffer,sizeof(buffer));
    size--;
    //printf("size %d\n",size);
    }
    /*while(fgets(line, MAXLINE, fp)!=NULL){
    reti_writen(sockfd, line, strlen(line));
    }
    reti_writen(sockfd, "stopstopstop\n", 13*sizeof(char));**/
    printf("Fine copia file\n");
    }
    }
    }

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Ma il problema con il tuo codice qual è?

    Mica si può prendere, compilare e studiare ...

    Se non dai delle indicazioni - più precise possibili - su errori, malfunzionamenti, logica del programma, potresti non avere molte risposte ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    15
    Scusa !!errore mio!!
    Allora il client invia una richiesta con un nome di file!!il server cerca il file e se lo trova deve mandarlo al client!!
    il problema mio è come inviare il file al client!!il client crea un file..ma è sempre un file corrotto di dimensioni minori al file originale!!

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Non ho controllato il codice ma, per tutti i (tentativi) di codice che ha simili problemi la causa è data dal fatto che (sbagliando) si presuppone che i dati arrivino esattamente come sono inviati.

    Le comunicazioni in rete TCP garantiscono l'ordine con cui arrivano i dati, ma non che siano spediti esattamente come sono inviati.

    In poche parole, quando tu attendi una sequenza come

    stopstopstop

    non significa che questa arrivi così come l'hai spedita ma può arrivare una prima parte, ad esempio

    stopst

    dopo una ricezione dati e poi un'altra parte

    opstop

    alla prossima ricezione.

    I dati arrivano tutti e nell'ordine corretto ma tu te li aspetti così come li hai trasmessi e questo fatto non ti permette di gestire la ricezione corretta del file.

    La soluzione è spedire all'inizio il numero di byte che si trasmetteranno (in un formato fisso) e poi "contare" i byte che arrivano fino a quello che ci si attende.

    In questo senso, il tuo programma va riformato.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Comincerei ad assicurarmi che il file JPG sia aperto in binario...

    codice:
      if ((fp = fopen(prova, "rb")) == NULL)

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    15
    io avevo fatto in questo modo...

    in questa parte di codice mi calcolo la dimensione del file la salvo in size e la comunico al client

    fseek(fp,0,SEEK_END);
    size=ftell(fp);
    fseek(fp,0,SEEK_SET);
    sprintf(i, "%d\n", size);
    reti_writen(sockfd, i, strlen(i));

    poi leggo un byte per volta e lo invio al client..e intanto decremento size

    while (size>0)
    {
    fgets(buffer,1,fp);
    reti_writen(sockfd,buffer,sizeof(buffer));
    size--;
    }

    il client dopo aver ricevuto la dim del file la salva come intero in i e riceve i byte inviati dal server

    while (i>0)
    {
    bzero(buffer, 1);
    reti_readline(sockfd,buffer,sizeof(buffer));
    fputs(buffer,fp);
    fflush(fp);
    i--;
    }

    ma comunque non funziona!

  7. #7
    Occhio a questo erroraccio:

    Originariamente inviato da ktm84
    sprintf(i, "%d\n", size);

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    15
    non mi da problemi!!
    o almeno credo!!il client riceve correttamente la dimensione del file!!
    poi con atoi la converto!!
    Scusatemi!!ma C nn l'ho usato praticamente mai...ho fatto la stessa cosa in java e nn ho avuto problemi!!nn capisco perchè

  9. #9
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    15
    Io credo che il problema sia nel modo in cui leggo i dati dal file e li invio al client..e come il client legge i dati ricevuti e li scrive nel file..ma nn so cm risolvere

  10. #10
    Originariamente inviato da ktm84
    non mi da problemi!!
    Per puro caso credo. Pensa che a me una roba del genere neanche la compila (e giustamente direi):

    codice:
        int i;
        int size;
        sprintf(i, "%d\n", size);

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.