Buongiorno ragazzi.

Ho scritto il seguente programma client per un esame, il codice apparentemente sembra non mostrare errori,

ma purtroppo quando lo avvio mi da errore di segmentazione (core dump creato) :

codice:

#include < stdio.h>
#include < string.h>
#include < netdb.h>
#include < stdlib.h>
#include < sys/types.h>
#include < sys/socket.h>
#include < netinet/in.h>

#define MAX 5000

/*Numero di porta sul quale 
il client richiede la connessione*/

#define PORT 4000
#define MAXCONN 5

typedef struct megozio_musicale{
        char nome_cd[20];
        char artista[20];
        char genere_musicale[20];
        int qunatita;
        float prezzo;
}musica;

typedef struct richiesta{
        char nome_cd[20];
        char artista[20];
        char genere_musicale[20];
        float prezzo;
        int scelta;
}richiesta;

typedef struct prenotazione{
        char nome[20];
        char artista[20];
        char gener_musicale[20];
}prenotazione;

/* Funzione per inizializzare gli indirizzi */
void addr_initialize(struct sockaddr_in *indirizzo, int port, long IPaddr){
    indirizzo->sin_family = AF_INET;
    indirizzo->sin_port = htons((u_short) port);
    /* htons : host to network conversion, short */
    indirizzo->sin_addr.s_addr = IPaddr;
}

/* Programma principale */
int main(int argc, char * argv[]){
    char buff[MAX], buff1[MAX], buff2[MAX]; /* dati di invio e ricezione */
    int i, c, flag=0, flag1=0;
    int ok=0, ok1=0;
    int k=0, h=0, d;
        int scelta;
    char a='s', s=' ';

    musica V[50];

    musica m;
    richiesta r;
    prenotazione p;

    /* Descrittore del socket */
    int sd;

    /* Indirizzo del Server */
    struct sockaddr_in server_addr;

    /* Indirizzo del client */
    struct sockaddr_in mio_addr;

    /* Dimensione dell'indirizzo client */
    int mio_len = sizeof(mio_addr);

    /* Controllo per la connect() */
    int error;

    /* Inizializza l'indirizzo, alla funzione viene passato un puntatore alla struttura che
    identifica il server address nella quale mette il numero di Port passato come secondo parametro
    l'indirizzo IP insierito da riga di comando (argv[1]) e convertito nel formato di rete con la 
    inet_addr() */

    addr_initialize(&server_addr, PORT, inet_addr(argv[1]));
    /* Crea l'identificatore del socket */
    sd = socket(AF_INET, SOCK_STREAM, 0);

    /* crea una connessione sul socket appena creato */
    error = connect(sd,(struct sockaddr*) &server_addr, sizeof(server_addr));
    /* Controllo se la connect() è andata a buon fine */
    if(error==0){
        /* Se la connessione ha avuto effetto positivo stampa: Ho eseguito la connessione */
        printf("Ho eseguito la connessione\n");
        printf("\n\n\nBenvenuti nel negozio di cd musicali\n");
        switch(scelta){
                case 1: 
                printf("premi 1 se sei un nuovo cliente");
        break;

        case 2:
                        printf("premi 2 se sei un dipendente ");

                printf("\n\n Inserire password:  \n");
                scanf("%d", &k);
                write(sd,&k,sizeof(int));
                printf("\n Ho inviato la password per accedere... Verifica in corso\n");
                read(sd,&ok,sizeof(int));

                 while(ok!=1); 
                printf("\n Accesso riuscito....\n");
                do {printf("\n\n Iniziare nuova ricerca? S/N \n");
                scanf("\n%c", &a);
                } while(a!='s' && a!='n');

                case 3:
                        printf("premi 3 se sei l'amministratore ");

                printf("\n\n Inserire password:  \n");
                scanf("%d", &h);
                write(sd,&h,sizeof(int));
                printf("\n Ho inviato la password per accedere... Verifica in corso\n");
                read(sd,&ok1,sizeof(int));

                 while(ok1!=1); 
                printf("\n Accesso riuscito....\n");
                do {printf("\n\n Iniziare nuova ricerca? S/N \n");
                scanf("\n%c", &a);
                } while(a!='s' && a!='n');

    do{
        flag1=0;
        //send(sd,&flag1,sizeof(flag1),0);
        printf("\n.... inserisci il titolo del cd  \n");
        scanf("%s", buff1); 
        strcpy(r.nome_cd, buff1 );

        printf("\n.... SCEGLI OPERAZIONE \n");
        printf("\n 1) per iserire il titolo del cd ");
        printf("\n 2) per inserire il nome dell'artista ");
        printf("\n 3) per inserire il genere musicale ");
        printf("\n 4) per prenotare un cd ");
                printf("\n 5) pre richiedere l'informazioni complete sul prodotto");

        scanf("%d", &c);
        r.scelta=c;

        write(sd, &r, sizeof(richiesta));

        switch(r.scelta)  {
        case 1: printf("\n Richiesta: titolo cd \n");
                        recv(sd,&flag,sizeof(flag),0);
                    //  printf("\n Flag: %d\n", flag);
                        if(flag==1) {
                        read(sd, &d, sizeof(richiesta));
                        printf("\n Titolo ricevuto:.... %s", r.nome_cd);
                        }
                        else {
                            printf("\n Il cd richiesto non è prente nell'archivio\n");
                        }
                        break;
        case 2: printf("\n Richiesta: nome dell'artista\n");
                            recv(sd,&flag,sizeof(flag),0);

                            if(flag==1) {
                            recv(sd,buff,sizeof(buff),0);
                            printf("\n Nome artista ricevuto:.... %s", r.artista);
                            }
                            else {
                                printf("\n L'artista richiesto non è presente nell'archivio\n");
                            }
                            break;
        case 3: printf("\n Richiesta:  genere musicale \n");
                        recv(sd,&flag,sizeof(flag),0);
                        //printf("\n Flag: %d\n", flag);
                            if(flag==1) {
                            recv(sd,buff,sizeof(buff),0);
                            printf("\n Genere musicale ricevuto:.... %s", buff);
                            }
                            else {
                                printf("\n Le informazioni da lei richieste non rientrano nella ricerca in archivio\n");
                            }
                            break;
        case 4: printf("\n Richiesta: Prenotazione cd\n");
                        recv(sd,&flag,sizeof(flag),0);
                        //printf("\n Flag: %d\n", flag);
                            if(flag==1) {
                            recv(sd,buff,sizeof(buff),0);
                            printf("\nPrenotazione avvenuta:.... %s", buff);
                        }
                            else {
                                printf("\n La prenotazione di tale articolo non è più disponibile\n");
                            }
                            break;
        case 5: printf("\n Richiesta: informazioni complete sulla persona\n");
                        read(sd, &p, sizeof(richiesta));
                        printf("\n Informazioni complete ricevute:....");
                        printf("\n Titolo cd:.... %s", r.nome_cd);
                        printf("\n Nome Artista:.... %s", r.artista);
                        printf("\n Genere musicale:.... %s", r.genere_musicale);
                        break;
            default: ;
            }   
        do {printf("\n\n Iniziare nuova ricerca? S/N \n");
        scanf("\n%c", &a);
        } while(a!='s' && a!='n');
        if(a=='n') {
        flag1=1; 
        }
        } while(flag1!=1);
        send(sd,&flag1,sizeof(flag1),0);
        printf("\n Uscita dal negozio... ARRIVEDERCI \n\n");

        close(sd);
        return EXIT_SUCCESS;
                }
}

}

potreste darmi una mano a capire dove si trova l'errore? (ps:sono appena arrivato e non so se il codice va inserito in questo modo, se così non fosse mi scuso in anticipo.)

chiesto 10 Lug '15, 16:59

marius-77's gravatar image

marius-77
20112

modificato 10 Lug '15, 21:21

enzotib's gravatar image

enzotib ♦♦
14.0k112186


Il problema, credo, è questa istruzione:

addr_initialize(&server_addr, PORT, inet_addr(argv[1]));

Nel sorgente dovresti (per non dire devi) controllare il numero di argomenti che ricevi dalla command-line. In questo caso (dato che chiedi solo un argomento, l'IP) qualcosa del genere:

if ( argc != 2 ) {
    printf("Usage: %s IP\n", argv[0]);
    exit(EXIT_FAILURE);
}

così il programma stampa un messaggio ed esce se non riceve il giusto numero di argomenti.

Se ci sono altri errori non lo so, servirebbe anche il server.

Comunque, gdb e valgrind sono i tuoi migliori amici in queste occasioni, il debug è una parte fondamentale nello sviluppo software, impara ad usarli e queste piccole sviste non saranno più un problema.

coll. permanente

ha risposto 13 Lug '15, 17:51

nico's gravatar image

nico
9833416

Grazie mile, proverò a breve la tua soluzione.

(03 Ago '15, 17:09) marius-77 marius-77's gravatar image
La tua risposta
abilita/disabilita anteprima

Segui questa domanda

Via email:

Una volta eseguito l'accesso potrai iscriverti a tutti gli aggiornamenti qui

Via RSS:

Risposte

Risposte e commenti

Basi di markdown

  • *corsivo* o __corsivo__
  • **grassetto** o __grassetto__
  • collegamento:[testo](http://url.com/ "titolo")
  • immagine?![alt testo](/path/img.jpg "titolo")
  • elenco numerato: 1. Foo 2. Bar
  • per aggiungere un'interruzione di riga, aggiungi due spazi a fine riga e premi «Invio»
  • è supportato anche semplice HTML

Tag:

×22

domanda posta: 10 Lug '15, 16:59

domanda visualizzata: 1,402 volte

ultimo aggiornamento: 03 Ago '15, 17:43

Chiedi è un servizio di supporto gestito da Ubuntu-it. Contattaci!

powered by OSQAPostgreSQL database
Ubuntu e Canonical sono marchi registrati da Canonical Ltd.