Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it L'avatar di taba93
    Registrato dal
    Oct 2007
    Messaggi
    83

    [C/C++] Problema di segmentation fault (mysql)

    ciao a tutti...ho un problema con un codice che riceve via wifi dei dati e li immette in un db mysql facendo un controllo (in pratica se x e y sono già presenti nel db allora aggiorna il valore di pos altrimenti inserisce un nuovo record).
    Il problema nel mio codice sta nel fatto che dopo avere stampato sul terminale il SELECT * di una tabella del database mi scrive Segmentation Fault.
    Sto usando Ubuntu (linux) ed è un giorno che sono su questo problema...di seguito vi posto il codice...grazie mille! ciao ciao

    Codice PHP:
    #include <stdio.h>
    #include <mysql/my_global.h>
    #include <mysql/mysql.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <netdb.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>

    #define QUEUE_LEN 20
    #define BUFF_SIZE 20

    // per c++ #include <cstdlib>
    // per c++ #include <climits>
    // per c++ #include <cstring>
    // per c++ #include <memory>

    int main (){
    MYSQL *conn;        /*comandi per inizializzare mysql */
    MYSQL_RES *result;
    MYSQL_ROW row;
    MYSQL db;
    MYSQL_RES *res;
    MYSQL_FIELD *f;
    unsigned int n;
    int sk;
    int x;
    int y;
    int i;
    int client/* Socket per la comunicazione con il client */
    int ret/* Ritorno delle funzioni */
    int len/* Dimensione strutture dati */
    struct sockaddr_in s_addr/* Indirizzo Server */
    struct sockaddr_in c_addr/* Indirizzo Client */
    int buffer[BUFF_SIZE]; /* definisco l'arrey Buffer di Ricezione dati */
    int port 2001/* Porta del Server */
    char address[] = "127.0.0.1"/* Indirizzo IP del Server */
    const char *query =
                    
    "select * "
                    "from data "
    ;
    const 
    char *db_host="localhost";
    const 
    char *db_user="root";
    const 
    char *db_pass="";
    const 
    char *db_name="";

    /* Creazione del socket */
    sk socket(AF_INETSOCK_STREAM0);    

    while (
    1) {

        
    /* Inizializzazione indirizzo del Server */
        
    bzero(&s_addrsizeof(s_addr));
        
    s_addr.sin_family AF_INET;
        
    s_addr.sin_port htons(port);
        
    s_addr.sin_addr.s_addr htonl(INADDR_ANY);
        
    /* Bind del socket */
        
    ret bind(sk, (struct sockaddr*) &s_addrsizeof(s_addr) );
        
    /* Creazione coda di richieste di connessione */
        
    ret listen(skQUEUE_LEN);
        
    /* Inizializzazione indirizzo del Client */
        
    bzero(&c_addrsizeof(c_addr));
        
    len sizeof(c_addr);
        
    /* Accept connessioni con i client */
        
    client accept(sk, (struct sockaddr*)&c_addr, &len );
        
    /* Ricezione Dati */
        
    ret recv(clientbufferBUFF_SIZE0);
        
    /* scomposizione array in variabili indipendenti */
        
    int receivedx buffer[0];
        
    int receivedy buffer[1];
        
    int receivedpos buffer[2];
        
    printf("X: %d\n"receivedx);
        
    printf("Y: %d\n"receivedy);
        
    printf("POS: %d\n"receivedpos);

            if (
    mysql_init(&db)==NULL)  {
                    
    printf ("Non sono riuscito a inizializzare. \n");
                    exit(
    1);
            }
     
            if (!
    mysql_real_connect(&dbdb_hostdb_userdb_passNULL0NULL0))
                    
    printf ("Errore di connessione al database su %s\n",db_host);
            else
                    
    printf ("Connessione avvenuta con successo al database su %s\n",db_host);
     
            if (
    mysql_select_db(&db,db_name))
                    
    printf ("Errore di connessione al database %s\n",db_name);
            else
                    
    printf ("Connessione avvenuta con successo al database %s\n",db_name);
            if ( 
    mysql_real_query (&dbquery, (unsigned intstrlen(query)) )  {
                    
    printf ("Errore nell'esecuzione della query %s\n",query);
                    exit(
    2);
            }
            
                
    res mysql_store_result(&db);
                       
    mysql_num_fields(res);
                       
    mysql_fetch_fields(res);
                    for (
    i=0i<ni++){
                            
    printf ("%s\t",f[i].name);
                        
    printf ("\n");

                }
     
                    while ((
    row=mysql_fetch_row(res)))  {
                            for (
    i=0i<ni++){ printf ("[%s]\t"row[i]);  }
                               
                    
    row[1] = x;
                    
    row[2] = y;                
                    
    printf ("\n");
                    
    //PARTE INSERIMENTO/UPDATE dati nel database

                    
    char str[79];
                    if(
    row[1] == receivedx && row[2] == receivedy){            
                    
    sprintf(str"UPDATE data SET pos (%d)"receivedpos);    
                     
    mysql_query(connstr);
                    
    printf("Elemento modificato con successo");
                    }
                    else {
                    
    sprintf(str"INSERT INTO data (x, y, pos) VALUES ( %d, %d, %d)"receivedxreceivedy,                 receivedpos);

                     
    mysql_query(connstr);
                    
    printf("Elemento inserito con successo");
                    }
        }
          
    mysql_free_result (res); 
            
    mysql_close(&db);

            
         
    /* Chiusura del socket di comunicazione con il Client */
        
    close(client);
    }



  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Dovresti individuare con precisione la linea che genera il fault ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it L'avatar di taba93
    Registrato dal
    Oct 2007
    Messaggi
    83
    L'errore credo sia in queste righe qui e precisamente nel while:

    while ((row=mysql_fetch_row(res))) {
    for (i=0; i<n; i++){
    printf ("[%s]\t", row[i]);
    }
    row[1] = x;
    row[2] = y;
    printf ("\n");

    //PARTE INSERIMENTO/UPDATE dati nel database
    char str[79];

    perchè se provo a chiudere il while ((row=mysql_fetch_eccetera
    lasciando fuori row[1] row[2] e char str[79] mi stampa tutti i risultati del database ma poi mi dà segmentation fault.
    ho provato subito dopo al ciclo a mettere un printf("ciao"); per vedere se me lo stampava ma non ci arriva. sembra proprio non uscire dal ciclo!!!!

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Controlla, in modalità debug, il contenuto delle variabili ... a "distanza", senza poter eseguire il codice, non si puo' dire molto ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it L'avatar di taba93
    Registrato dal
    Oct 2007
    Messaggi
    83
    quel problema lo ho risolto.
    mi servirebbe però sapere come poter mettere delle variabili all'interno di questa query:

    char *query2 = "INSERT INTO `dati` (`x` ,`y` ,`pos`) VALUES ('%s', '%s', '%s', receivedx, receivedy, receivedpos);";

    //eseguo la query

    if ( mysql_real_query (&db, query2, (unsigned int) strlen(query2)) ) {
    printf ("Errore nell'esecuzione della query %s\n",query2);
    exit(2);
    }

    se la eseguo in questa maniera mi dà errore nell'esecuzione.
    Grazie,

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Ovviamente ... in C usa la funzione sprintf ...
    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 © 2024 vBulletin Solutions, Inc. All rights reserved.