Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 26
  1. #1

    [C] Problema invio int

    Salve gente

    In un programma client-server che sto sviluppando, dal client si inseriscono i dati nome e password, e in automatico
    viene generato un int di permesso random. I dati vengono inviati al server tramite 3 write sequenziali con supporto
    di una struct così definita:

    codice:
    typedef struct {
            char nickname[MAX_SIZE];
            char password[MAX_SIZE];
            int permesso; //assegnato random durante la registrazione
    }Utente;
    Il server farà 3 read sequenziali ovviamente per leggere i dati e registrare l'utente. La registrazione avviene su un file, e il problema che incontro è sul numero che indica il permesso! Su file invece di comparire 1, 2,o 3, compare 6CB, sempre. Allego parte del codice..

    generazione numero random tra 1 e 3 compresi:

    codice:
    int permessoRandom() {
    	int esito;
    	srand(time(NULL));
    	esito = rand()%3;
    	esito++;
    	return esito;
    }
    write del permesso dal client (sono sicuro di aver sbagliato o questa o la read nel server)...
    codice:
    while(write(sock,&utente.permesso,sizeof(permesso)) <= 0) {
    		if(errno != EINTR) {
                if(errno == ECONNRESET || errno == EPIPE) {
                    printf("\nErrore nella write di [permesso]: CONNESSIONE FALLITA\n");
                    return -1;
                }
                else {
                    printf("La write di [permesso] è fallita\n");
                    return -1;
                }
            }
            printf("Errore system call write [permesso]\n");
    }
    read del permesso dal server
    codice:
    while(read(sock,&utente.permesso,sizeof(int)) <= 0) {
    		if(errno != EINTR) {
                if(errno == ECONNRESET || errno == EPIPE) {
                    printf("\nErrore nella read di [permesso]: CONNESSIONE FALLITA\n");
                    return -1;
                }
                else {
                    printf("La read di [permesso] è fallita\n");
                    return -1;
                }
            }
            printf("Errore system call read [permesso]\n");
    }
    scrittura dell'utente su file..
    codice:
    int registraUtente(Utente utente) {
    	
    	int ds = open("login",O_WRONLY|O_APPEND);
    	if(ds == -1) {
    		return -1;
    	}
    	
    	int w = write(ds,&utente,sizeof(utente));
    	if(w == -1) {
    		return -1;
    	}
    	
    	close(ds);
    	
    	return 1;
    }
    Help meeee

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Potrebbe dipendere da come invii i dati precedenti ...

    Ma perché non invii tutta la struttura con una singola write?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Oddio si può inviare direttamente tutta la struct? Va bhe comunque non credo che risolverebbe il problema. Non penso dipenda da come invio i dati precedenti perché provando a far
    girare il programma e successivamente controllare il file login, in esso nome utente e
    password compaiono in modo corretto:

    nome#password#6CB

    Al posto di 6CB dovrebbe esserci 1, 2 o 3.. xD

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Hai fatto un po' di debugging?

    Se inserisci una

    printf("%d\n", utente.permesso);

    subito dopo la read, cosa viene visualizzato?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Fai vedere anche come invii le stringhe nickname e password, il problema potrebbe essere che nelle prime read leggi un numero inferiore di caratteri a quelli effettivamente inviati, così nella read successiva leggi i caratteri che avevi inviato prima.

  6. #6
    Ecco le altre write:

    codice:
    while(write(sock,utente.nickname,sizeof(utente.nickname)) <= 0) {
    		if(errno != EINTR) {
                if(errno == ECONNRESET || errno == EPIPE) {
                    printf("\nErrore nella write di [nickname]: CONNESSIONE FALLITA\n");
                    return -1;
                }
                else {
                    printf("La write di [nickname] è fallita\n");
                    return -1;
                }
            }
            printf("Errore system call write [nickname]\n");
    }
    	
    while(write(sock,utente.password,sizeof(utente.password)) <= 0) {
    		if(errno != EINTR) {
                if(errno == ECONNRESET || errno == EPIPE) {
                    printf("\nErrore nella write di [password]: CONNESSIONE FALLITA\n");
                    return -1;
                }
                else {
                    printf("La write di [password] è fallita\n");
                    return -1;
                }
            }
            printf("Errore system call write [password]\n");
    }
    E le rispettive read:
    codice:
    while(read(sock,utente.nickname,sizeof(utente.nickname)) <= 0) {
    		if(errno != EINTR) {
                if(errno == ECONNRESET || errno == EPIPE) {
                    printf("\nErrore nella read di [nickname]: CONNESSIONE FALLITA\n");
                    return -1;
                }
                else {
                    printf("La read di [nickname] è fallita\n");
                    return -1;
                }
            }
            printf("Errore system call read [nickname]\n");
    }
    	
    while(read(sock,utente.password,sizeof(utente.password)) <= 0) {
    		if(errno != EINTR) {
                if(errno == ECONNRESET || errno == EPIPE) {
                    printf("\nErrore nella read di [password]: CONNESSIONE FALLITA\n");
                    return -1;
                }
                else {
                    printf("La read di [password] è fallita\n");
                    return -1;
                }
            }
            printf("Errore system call read [password]\n");
    }

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Non usare la sizeof per le stringhe ma la costante MAX_SIZE

    P.S. Hai fatto la prova che ti ho chiesto?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    In questo caso sizeof va bene perché ritorna direttamente la dimensione dell' array, che è MAX_SIZE*sizeof(char) , non è quello il problema.
    Stavo pensando a cosa succede se due macchine che hanno un sizeof(int) diverso provano a connettersi.
    Se utilizzi due macchine diverse prova a stampare sizeof(int) su entrambe, se i valori sono diversi il valore permesso lo scrivi con la sprintf su una stringa.

  9. #9
    Intanto mi ero dimenticato di ricompilare il client, dopo che cambiai il codice per generare il numero casuale >.>

    Andando a ricompilare il server ho questo errore >.>

    gcc -Wall -o "supportoServer" "supportoServer.c" (nella cartella: /home/loris/Scrivania/TesinaC)
    In file included from funzioniServer.h:1:0,
    from supportoServer.c:2:
    globali.h:24:2: error: conflicting types for ‘Utente’
    globali.h:24:2: note: previous declaration of ‘Utente’ was here
    Compilazione fallita.

    Non capisco cosa significa .-.

    Comunque sia, ho rieseguito il codice ed ora per aprire il file login devo esplicitamente dirgli di utilizzare gedit altrimenti
    dice che è di un formato sconosciuto. Una volta aperto il file, adesso al posto di 6CB compare un quadratino con dei piccoli numeretti dentro >.>

    Ps: Ho scritto printf("Permesso: %d",utente.permesso); dopo la read, ma non fa nulla >.<

  10. #10
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Nell' header file per evitare inclusioni doppie, aggiungigli la guardia:

    codice:
    #ifndef NOME_HEADER
    #define NOME_HEADER
    
    <contenuto dell' header>
    
    #endif
    PS: Leggi anche il post che ho scritto prima.

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.