Visualizzazione dei risultati da 1 a 7 su 7

Visualizzazione discussione

  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

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.