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

    Errore di segmentazione Core dump

    CLIENT

    codice:
    #include <stdio.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netdb.h>
    #include <netinet/in.h>
    #include <stdlib.h>
         
    //#define MAX 8192 /* in bytes, 8KB */
         
    int main() {
        int sd;
        struct sockaddr_in server_addr; /* l'indirizzo del server */
        //char buff[MAX]; /* dati di invio e ricezione */
        
        /* Utilizzando la struttura hostent si definisce l'indirizzo del server */
        struct hostent *hp;
        char ip;
        printf("Inserisci l'indirizzo ip: ");
        scanf("%s", &ip);
        hp = gethostbyname(&ip);
         
        server_addr.sin_family = AF_INET;
        
        int porta;
        printf("Inserisci la porta: ");
        scanf("%d", &porta);
        printf("-*-*-*-*-*--*-*-*-*-*-*-*-\n");
        
        
        int arrayOp[2];
          
        printf("Primo operando: ");
        scanf("%d", &arrayOp[0]);
        printf("Secondo operando: ");
        scanf("%d", &arrayOp[1]);    
         
        printf("Scegli l'operazione da eseguire: (1.+ 2.- 3.* 4./ 5.esci)\n");
        scanf("%d", &arrayOp[2]);
        
        if(arrayOp[2]!= 5){
            server_addr.sin_port = htons(porta);
            /* successivamente viene memorizzato nella struttura server_addr */
            server_addr.sin_addr.s_addr = ((struct in_addr*)(hp->h_addr)) -> s_addr;
             
            /* Viene creato il socket descriptor */
            if((sd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
            printf("Errore nella creazione della socket\n");
             
            /* Viene connesso al server */
            if(connect(sd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)
            printf("Errore di connessione al server\n");
            
            send(sd, arrayOp, sizeof(arrayOp), 0);
            recv(sd, arrayOp, sizeof(arrayOp), 0);
            
            switch(arrayOp[2]){
                case 1: printf("Addizione \n"); 
                        printf("%d + %d = %d\n", arrayOp[0], arrayOp[1], (arrayOp[0]+arrayOp[1])); 
                        break;
                case 2: printf("Sottrazione \n"); 
                        printf("%d - %d = %d\n", arrayOp[0], arrayOp[1], (arrayOp[0]-arrayOp[1]));
                        break;
                case 3: 
                        printf("Moltiplicazione \n"); printf("%d * %d = %d\n", arrayOp[0], arrayOp[1], (arrayOp[0]*arrayOp[1]));
                        break;
                case 4: 
                        printf("Divisione \n"); printf("%d / %d = %d\n", arrayOp[0], arrayOp[1], (arrayOp[0]/arrayOp[1]));
                        break;
                case 5:
                        printf("ciao");
                        break;
                default: 
                        printf("Errore nello switch\n"); 
                        break;
            }
        }
        close(sd);
        return 0;
       }
    SERVER
    #include <stdio.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <netdb.h>
    #include <stdlib.h>
    #include <time.h>
    /*#include <arpa/inet.h>*/ /* Se si vuole visualizzare l'indirizzo ip del client, decommentare questa riga */
     
    //#define MAX 8192 /* in bytes, 8KB */
     
    int main()
        {
        //char buff[MAX]; /* dati di invio e ricezione */
        struct sockaddr_in server_addr; /* indirizzo del server */
        struct sockaddr_in client_addr; /* indirizzo del client */
        int sd_server, sd_client; /* i socket descriptor usati per identificare server e client */
        /*
         * Creazione socket descriptor per il server.
         * AF_INET + SOCK_STREAM --> TCP, utilizzo del protocollo TCP (IPPROTO_TCP)
         */
        if((sd_server = socket(AF_INET, SOCK_STREAM, 0)) < 0)
        printf("Errore nella creazione del server\n");
         
        /*
         * Inseriamo nella struttura alcune informazioni
         */
        server_addr.sin_family = AF_INET; /* la famiglia dei protocolli */
        server_addr.sin_port = htons(4000); /* la porta in ascolto */
        server_addr.sin_addr.s_addr = INADDR_ANY; /* dato che è un server bisogna associargli l'indirizzo della macchina su cui sta girando */
         
        /*
         * Assegnazione del processo alla socket tramite la funzione BIND
         */
        if(bind(sd_server, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)
        printf("Errore di binding\n");
         
        /*
         * Si mette in ascolto con un massimo di 20 connessioni
         */
         int arrayOp[2];
         while(arrayOp[2] != 5)
         {
            listen (sd_server, 20);
         
            /*
            * Essendo un server monothreading, accetterà una sola connessione per volta
            */
            int address_size = sizeof(client_addr); /* dimensione della struttura client_addr */
            /* Con opportune modifiche si potrebbe vedere anche l'ip del client */
            if((sd_client = accept(sd_server, (struct sockaddr *)&client_addr, &address_size)) < 0)
                printf("Errore nella chiamata accept\n");
                
            /* si ricevono i dati dal client */
            recv(sd_client, arrayOp, sizeof(arrayOp), 0);
            
            printf("Operando 1--> %d | Operando 2 --> %d | scelta --> %d\n", arrayOp[0], arrayOp[1], arrayOp[2]);
    
    
            if(arrayOp[2]==1)
            {
                //ris = op1 + op2;
                //send(sd_client, arrayOp, sizeof(arrayOp), 0);
                arrayOp[2]=1;
            }
            else if(arrayOp[2]==2)
            {
                //ris = op1 - op2;
                //send(sd_client, arrayOp, sizeof(arrayOp), 0);
                arrayOp[2]=2;
            }
            else if(arrayOp[2]==3)
            {
                //ris = op1 * op2;
                arrayOp[2]=3;
            }
            else if(arrayOp[2]==4)
            {
                //ris = op1 / op2;
                arrayOp[2]=4;
            }
            else if(arrayOp[2]==5)
            {
                arrayOp[2]=5;
            }
            /* si spedisce un messaggio */
        
            send(sd_client, arrayOp, sizeof(arrayOp), 0);
         }
        /* chiusura del socket descriptor */     
        close(sd_server);
        close(sd_client);
        return 0;
    }

    Quando compilo non ci sono errori ma in run time mi da errore di segmentazione core dump creato. Per favore aiutatemi. Grazie
    Ultima modifica di LeleFT; 24-11-2015 a 09:53 Motivo: Aggiunti i tag CODE

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    La prima cosa che ho visto, e mi sono fermato, è che inserisci una stringa in ip che è un char... ovvio che c'è un seg fault. Non escludo altri errori ...

    p.s. Se usassi i tag code per il codice sarebbe meglio
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Quindi l'errore sta nello scanf?

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Quote Originariamente inviata da davi97zi Visualizza il messaggio
    Quindi l'errore sta nello scanf?
    Che vuol dire "sta nello scanf"? L'errore è che hai usato un char !

    E ti ripeto, questo è sicuramente un errore, non escludo ce ne siano altri ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Ok allora cambio il char ip in int ip e speriamo che funzioni. Grazie

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Quote Originariamente inviata da davi97zi Visualizza il messaggio
    Ok allora cambio il char ip in int ip e speriamo che funzioni. Grazie
    La programmazione non è un atto di fede, ma un lavoro basato su regole matematiche.
    Ad ogni modo, ti è stato detto che stai cercando di leggere da tastiera un indirizzo IP e stai cercando di memorizzarlo in un char (una variabile che può contenere un solo carattere).

    Non serve buttarsi sulla fede per capire che lo stesso dato (un indirizzo IP) non può essere contenuto nemmeno in una variabile di tipo int, che può contenere un solo valore numerico intero...


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Quello che ti serve non è un intero ma il tipo di dato che viene accettato dalla funzione

    gethostbyname

    A quanto detto da Lele aggiungo che non si può scrivere codice a caso.
    Bisogna studiare e documentarsi. Ad esempio la documentazione della gethostbyname in

    http://linux.die.net/man/3/gethostbyname

    accetta un array di char (una stringa C) che è quello che devi usare.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.