Salve a tutti... Vi espongo il mio problema. Ho il seguente codice che compilato non produce errori, soltanto qualche warning, ma mandato in esecuzione mi produce un segmentation fault se eseguito su ubuntu di versione inferiore a 14.04. Come posso risolvere? Si tratta di un client FTP che invia un file al server tramite le socket, il server funziona correttamente.

/*
*
*   PARTE CON ./nomeprogramma indirizzoIpServer percorso nomeFile
*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

int connessione_tcp (char* host, char* service);

int main(int argc, char* argv[])
{
    //FASE DICHIARATIVA
    int descrittore, buffer;
    FILE *fp;
    char percorso[1024], nome[50];
    //FASE ESECUTIVA
    strcpy(percorso,argv[2]);
    strcpy(nome,argv[3]);
    strcat(percorso,"/");
    strcat(percorso,nome);

    descrittore=connessione_tcp(argv[1],"FTP");
    if(descrittore<0)
        printf("C'è stato un problema con la funzione socket()");
    else
    {
        printf("E' stata stabilita una cossessione con il server tramite la socket che ha come descrittore %d\n",descrittore);

        fp=fopen(percorso,"r");
        if(fp==NULL)
            printf("Errore di apertura del file!\n");
        else
        {
            write(descrittore, &nome, sizeof(nome));

            while(fread(&buffer, sizeof(buffer), 1, fp))
            {
                write(descrittore, &buffer, sizeof(buffer));
            }
            printf("File %s inviato con successo a %s\n",nome,argv[1]);
            fclose(fp);
        }

        close(descrittore);

    }
}

int connessione_tcp (char* host, char* service)
{
    //FASE DICHIARATIVA
    struct hostent *informazioni_host;
    struct servent *informazioni_server;
    struct sockaddr_in server;
    int descrittore;
    //FASE ESECUTIVA
    descrittore=socket(AF_INET,SOCK_STREAM,0);
    informazioni_host=gethostbyname(host);
    informazioni_server=getservbyname(service,"tcp");
    server.sin_family=AF_INET;
    memcpy((char*)&server.sin_addr,informazioni_host->h_addr,informazioni_host->h_length);
    server.sin_port=informazioni_server->s_port;
    connect(descrittore,(struct sockaddr*)&server,sizeof(server));
    return descrittore;
}

P.S. Le librerie sono inserite senza parentesi angolari perché l'editor non me le mostrava

chiesto 13 Apr '15, 16:49

Vyto's gravatar image

Vyto
1011

modificato 14 Apr '15, 09:49

enzotib's gravatar image

enzotib ♦♦
14.0k112186

L'altra versione di Ubuntu su cui le esegui ha la stessa architettura?

Se lo ricompili sull'altro computer hai ancora il segfault?

(13 Apr '15, 22:11) dadexix86 ♦♦ dadexix86's gravatar image

No l'architettura é diversa. Sul computer di casa dove ho ubuntu 14.04 funziona. Mentre sui computer della scuola che sono un po' vecchiotti c'è ubuntu 11.10

(14 Apr '15, 09:18) Vyto Vyto's gravatar image

Che warning ti da?

(14 Apr '15, 10:34) loucho loucho's gravatar image

L'architettura è 32 o 64 bit, non la versione di Ubuntu.

La 11.10 non è più supportata, come saprai, e non mi stupirebbe che l'errore derivi da un bug lì presente.

Se provi a compilarlo sul computer con la 11.10 ti dà problemi o compila bene?

(14 Apr '15, 10:38) dadexix86 ♦♦ dadexix86's gravatar image

Le architetture che uso sono a 32 bit... Solo che sul mio computer di casa ho ubuntu 14.04 mentre su quelli della scuola ubuntu 11.10 . In fase di compilazione non mi produce errori, solo qualche warning sulle strcat e strcpy e poi sulla memcpy. Il problema é l'esecuzione: dopo avergli passato ci parametri nella forma descritta nel commento nel codice mi butta fuori il segmentation fault

(14 Apr '15, 14:19) Vyto Vyto's gravatar image
Scrivi tu la prima 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:

×103
×22
×8

domanda posta: 13 Apr '15, 16:49

domanda visualizzata: 530 volte

ultimo aggiornamento: 14 Apr '15, 14:22

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

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