Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    7

    [C]problemi con la fgets()

    Ciao a tutti,

    sto cercando di scrivere una semplice applicazione client/server in C sotto linux. ho consultato i vecchi post facendo una ricerca con "socket C" e ho trovato vari esempi da cui ho tratto spunto per risolvere altri problemi; tuttavia rimango fermo a questo punto:

    io dovrei trasferire da client a server una stringa intera completa di spazi con cui specificare, ad esempio, un comando come "copia <sorgente> <destinazione>"; per fare questo uso la funzione fgets(). però al server arrivano come tre stringhe separate e non so come fare! allego il codice con un esempio di uscita attuale (errata).


    lato_server:
    codice:
    char buffer[1024];
    FILE* in,*out;
    in=fdopen(sk,"r");
    out=fdopen(sk,"a");
    setbuf(in,NULL);
    setbuf(out,NULL);
    const char*bye={"bye"};
    
    
    for(;;){
    
    	/*....*/
    fscanf(in,nullo,"%s",buffer);
    printf("Recieved string: %s\n",buffer);
    
    if( strcmp(buffer, bye) == 0){
    	close(sc);
    	exit(0);
        }
    	/*...*/
    }
    close(sc);
    .
    .
    .
    lato_client

    codice:
    char nome[1024];
    FILE* in,*out;
    in=fdopen(sk,"r");
    out=fdopen(sk,"a");
    setbuf(in,NULL);
    setbuf(out,NULL);
    
    for(;;){
    
    	printf("FTP>");
    	
    	fgets(nome,sizeof(nome),stdin);
    	printf(nome,"%s");
    
    	fprintf(out,nome);
    
    }
    Uscita:

    client: FTP> copia sorg dest
    server: received message: copia
    server: received message: sorg
    server: received message: dest




    un altro problema che da questo codice è che il server una volta ricevuto la stringa "bye" che dovrebbe chiudere la connessione, va in loop stampando a video "bye". Non ne posso piu, vi prego ditemi dove sto sbagliando! grazie mille!

  2. #2
    Utente di HTML.it L'avatar di /dev/null
    Registrato dal
    May 2004
    Messaggi
    1,936
    Per quanto riguarda le socket studiale qui' che e' una guida fatta benissimo
    http://www.lilik.it/~mirko/gapil/gapil.html
    (la sezione due tratta la programmazione di rete)


    Per fare cio' che vuoi inoltre ti consiglio di non usare i files, ma le socket (quindi file descriptor), troverai tutto sui files descriptor nel capitolo 6 della GaPiL...


    comunque hai quel problema perche' le funzioni *scanf() si fermano quando trovano uno spazio... Per evitare questo inconveniente potresti cercare di modificare il tipo di bufferizzazione dello stream: guarda qui' http://www.lilik.it/~mirko/gapil/gapilsu111.html
    Una volta aperti i files con la funzione fdopen dovresti eseguire sui puntatori in e out la seguente funzione
    setvbuf(FILE *stream, char *buf, int mode, size_t size)
    in questo modo:

    setvbuf (in, char *buf, _IONBF, 0)
    setvbuf (out, char *buf, _IONBF, 0)


    In questo modo pero' non godrai dei vantaggi offerti dalla lettura bufferizzata... Per sapere quali sono leggiti qui': http://www.lilik.it/~mirko/gapil/gapilch8.html



    Ultima modifica ad opera dell'utente /dev/null il 01-01-0001 alle 00:00

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    7
    grazie mille vado subito a vedere

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.