Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 29
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2012
    Messaggi
    18

    [C] Errore di segmentazione

    Ho realizzato un programma che usa smtp e pop3 per scrivere e leggere email.
    Ho usato switch case per scegliere il comando da usare , la prima iterazione viene completata nella sseconda da' errore di segmentazione alla riga sin.sin_addr.s_addr = *((unsigned long*) he->h_addr);.
    Questo è il programma:
    codice:
     
    #include <winsock2.h> 
    #include <stdlib.h> 
    #include <conio.h> 
    #include <stdio.h> 
    #include <string.h> 
    
    #define host "smtp.unimi.it" 
    #define portm 25
    
    #define host1 "mailserver.unimi.it"
    #define port1 110
    
    /* Macro definitions */
    #define TABLELEN        63
    #define BUFFFERLEN      128
    
    #define ENCODERLEN      4
    #define ENCODEROPLEN    0
    #define ENCODERBLOCKLEN 3
    
    #define PADDINGCHAR     '='
    #define BASE64CHARSET   "ABCDEFGHIJKLMNOPQRSTUVWXYZ"\
                            "abcdefghijklmnopqrstuvwxyz"\
                            "0123456789"\
                            "+/";
    
    /* Function prototypes */
    int Base64Encode(char *input, char *output, int oplen);
    int encodeblock(char *input, char *output, int oplen);
    int Base64Decode(char *input, char *output, int oplen);
    int decodeblock(char *input, char *output, int oplen);
    int main() 
    { 
        fflush(stdin);
        fflush(stdout);
        WORD AS;                                     //WORD -> unsigned short int 
       WSADATA WData;        
       SOCKET s;  
       struct hostent *he;                          //host 
         
    /*variabili client smtp*/
    
        char answer[256]="";
        int rc= 0;
        char sendp [BUFFFERLEN + 1]= "";             /* indirizzo email password*/
        char sendp1[BUFFFERLEN+1]="";                /*indirizzo email mittente*/
        char sendp2[BUFFFERLEN+1]="";                /*indirizzo email destinatario*/                
        char encodedoutput[BUFFFERLEN + 1] = "";     /*variabile con indirizzo email password con base 64*/
        char msped[BUFFFERLEN+1]="";                 /*messaggio mandato*/    
        
    /*variabili per pop3*/            
        SOCKET s1;  
        char answer1[4290]="";
        char sendpop1[256]="";                /* indirizzo email password*/
        char answer2[4096]="";
        char leg='a';                         /*risposta per la lettura di una email*/
        int rin=1;       
        int i;   
        char str[strlen("\r\n.\r\n")]="\r\n.\r\n";     
    
    /*variabili condivise*/        
        char in='a';                                 /*risposta iniziale*/
        int port=0;   
        char rit='s';    
        system("cls"); 
        
                                                    //system("Pause"); 
        
        AS = MAKEWORD(2, 0);    
    
       if (WSAStartup(AS, &WData) != 0)             //inizializza in WSAStartup 
        { 
        printf("error cant initialize WinSock2\n"); 
       WSACleanup();                                //si pulisce con WSACleanup
       return 1; 
       } 
        
       while (rit=='s')
       {   
       port=0;
       
       printf("Benvenuto, se vuoi mandare una email scrivi a,\r\nse vuoi leggere una email scrivi b\r\n");
       fflush(stdin);
       scanf("%c",&in);   
       
       if (in=='a')
       {he = gethostbyname(host);                    //getting host   
        port=portm;
        printf("1\r\n");
        }   
       
       else {he = gethostbyname(host1);                    //getting host
            port=port1;
            printf("2\r\n");
            }   
    
    struct  sockaddr_in sin; 
        sin.sin_family = AF_INET;                                                   /*internet address family*/
        sin.sin_addr.s_addr = *((unsigned long*) he->h_addr);                       /*indirizzo del server*/
        sin.sin_port = htons(port);                                                 //numero di porta 
    
    /*memcpy(h_addr,he->h_addr,sizeof(he->h_addr));*/
       
       switch (in) 
       { 
       case 'a': 
    
       if (he == NULL) 
        { 
       printf("\r\n");
       printf("host not found.\n"); 
       system("PAUSE"); 
       return 1; 
       } 
        else 
        { 
        printf("\r\n");
        printf("host found.\n");    
        }
    ...
    default :
     printf("Hai digitato una lettera sbagliata\r\n");
    
     getch();
     return 0;
     
     }
     
     printf("\r\n");
     printf("Desideri mandare una email oppure leggerne digita s \r\nse non vuoi inserisci un'altra lettera\r\n");
     
     fflush(stdin);
     scanf("%c",&rit);
     printf("\r\n");
     
     }
     
     printf("\r\n");
     printf("Arrivederci\r\n");
     getch(); 
    
    
     }

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Non riesco a replicare il tuo problema ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2012
    Messaggi
    18
    In che senso?

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Nel senso che ho provato e non ho errori.

    Cosa dovrei fare per replicare esattamente i passi che ti portano all'errore?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2012
    Messaggi
    18
    prova a cambiare gli indirizzi dei server in define usando dopo i tre punti
    codice:
        s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);                              //viene costruita la socket  
        if (s <0)
        printf("la socket non funziona /r/n");
    
        
        printf("\r\n");
        printf("\n...Connessione al server in atto...\n"); 
        
        connect(s,(struct sockaddr*)&sin,sizeof(sin));                             
     //crea la connessione con il server smtp.unimi.it
        
        send(s,"HELO <smtp.unimi.it>\r\n",strlen("HELO <smtp.unimi.it>\r\n"),0); /*manda HELO <smtp.unimi.it>*/
        
        recv(s,answer,sizeof(answer),0);                                           
    /*riceve la risposta del server 220*/
    printf("S: %s\n",answer);                                                 
     /*stampa la risposta */
         
        printf("\r\n");
        
        strcpy(answer,"");
        recv(s,answer,sizeof(answer),0);                                          
     /*riceve la risposta del server*/
        
        printf("S: %s\n",answer);                                                  
    /*stampa la risposta del server*/
        
        printf("\r\n");
        
        const char* send_str = "AUTH LOGIN\r\n";                                  
      /*stringa di caratteri AUTH LOGIN*/
        
        send(s, send_str, strlen(send_str), 0);                                 
        /*manda la stringa al server*/
        printf("C: AUTH LOGIN\r\n");
        recv(s,answer,sizeof(answer),0);                                           /*riceve la risposta del server*/
        
        printf("S: %s\n",answer);                                                  /*stampa la risposta del server*/
        
        printf("\r\n");
        
        strcpy(answer,"");
                             
                             printf("------> Scrivi il tuo indirizzo di posta elettronica per esteso\r\n");
                             scanf("%s",sendp);
                             rc = Base64Encode(sendp, encodedoutput, BUFFFERLEN); 
                             send(s,encodedoutput,sizeof(encodedoutput),0);
                             send(s,"\r\n",strlen("\r\n"),0);
       
                                                                                                         
                                                                                         /*manda l'indirizzo di posta elettronica in base 64 */   
      
        printf("C: %s\r\n",sendp);                                                       /*stampa l'indirizzo in forma alfanumerica*/
        
        printf("\r\n");
        
        recv(s,answer,sizeof(answer),0);                                                 /*riceve la risposta del server*/
       
        printf("S: %s\n",answer);                                                        /*stampa la risposta del server*/
    
        printf("\r\n");
        rc= 0;
        strcpy(sendp,"");
        strcpy(encodedoutput,"");
        fflush(stdin);
        
        strcpy(answer,"");
        
                             printf("------> Scrivi la tua password, guardati attorno la tua password non è nascosta\r\n");
                             scanf("%s",sendp);
                             rc = Base64Encode(sendp, encodedoutput, BUFFFERLEN); 
                             send(s,encodedoutput,sizeof(encodedoutput),0);
                             send(s,"\r\n",strlen("\r\n"),0);
        
                                                                                                            
                                                                                            /*manda la password in base 64*/
                                            
                                                                                            /*stampa la password nascosta */
        printf("\r\n");
        
        recv(s,answer,sizeof(answer),0);                                                  /*riceve la risposta del server*/
        
        printf("S: %s\n",answer);                                                         /*stanpa la risposta del server*/
        
        printf("\r\n");
         
        strcpy(answer,"");
      
    
        strcpy(sendp,"");
       
    
        
                        send(s,"MAIL From: ",strlen("MAIL From: "),0); 
                            printf("------> Scrivi l'indirizzo email tra < > \r\n");
                             scanf("%s",sendp); 
                             send(s,sendp,sizeof(sendp),0);
                             send(s,"\r\n",strlen("\r\n"),0);
                             
        
                                                                                      /*manda l'intestazione MAIL From:*/                    
                                                                                      
        
        printf("\r\n");
                                                                                                       
        printf("\r\n");
        
        recv(s,answer,sizeof(answer),0);                                              /*riceve la risposta del server*/
        
        printf("S: %s\n",answer);                                                     /*stampa la risposta del server*/
        
        printf("\r\n");
        rc= 0;
        strcpy(sendp,"");
        strcpy(encodedoutput,"");
        fflush(stdin);
    
                            
                            send(s,"RCPT To: ",strlen("RCPT To: "),0);                     /*manda l'intestazione RCPT To:*/                                            
                            printf("------> Scrivi l'indirizzo email del destinatario tra < > \r\n");
                             scanf("%s",sendp1);
                             send(s,sendp1,sizeof(sendp1),0);
                             send(s,"\r\n",strlen("\r\n"),0);
        
                                                                                      
        
        printf("\r\n");
        
        recv(s,answer,sizeof(answer),0); 
        
        printf("S: %s\n",answer);
        
        send(s,"DATA\r\n",strlen("DATA\r\n"),0);                                     /*manda l'intestazione DATA*/
        
        printf("C: DATA\r\n");
        
        
        printf("\r\n");        
        recv(s,answer,sizeof(answer),0);
        printf("S: %s\n",answer);
        
        printf("\r\n");
        
        strcpy(answer,"");
        
        strcpy(sendp,"");
    
                          send(s,"Subject:",strlen("Subject:"),0);                   /*manda l'intestazione Subject*/                                      
                          printf("------> Scrivi l'oggetto del messaggio \r\n");
                          fflush(stdin);
                          fflush(stdout);
                          printf("\r\n");
                          strcpy(sendp1,"");
                          strcpy(sendp2,"");
                          gets(sendp2);
                          send(s,sendp2,sizeof(sendp2),0);
                          send(s,"\r\n",strlen("\r\n"),0);
    
        
        strcpy(answer,"");
        
        printf("\r\n");
         
        strcpy(answer,"");
        
        strcpy(answer,"");
        strcpy(sendp,"");
        strcpy(msped,"");
        fflush(stdin);
        fflush(stdout);
                                        
                                        printf("------> Scrivi il messaggio su una sola linea\r\n");
                                        fflush(stdin);
                                        fflush(stdout);
                                        printf("\r\n");
                                        strcpy(msped," ");
                                        strcpy(sendp," ");
                                        gets(msped);
                                        send(s,msped,sizeof(msped),0);
                                        send(s,"\r\n",strlen("\r\n"),0);
                                        send(s,".\r\n",strlen(".\r\n"),0);
                                        
                                                                                            /*send(s,"hello\r\n",strlen("hello\r\n"),0); */                                
                                                                                            /*manda hello*/
        
                                                                                            /*send(s,".\r\n",strlen(".\r\n"),0);*/                                      
                                                                                            /*manda il . per indicare la fine del testo*/
        
        printf("\r\n");
        
        recv(s,answer,sizeof(answer),0);                                                    /*riceve la risposta del server*/
        
        printf("S: %s\n",answer);                                                           /*stampa la risposta del server*/
        
        printf("\r\n");
        
        strcpy(answer,"");
        
        send(s,"QUIT\r\n",strlen("QUIT\r\n"),0);                                            /*manda il messaggio QUIT*/
        
        strcpy(msped,"");
        
        fflush(stdin);
        
        fflush(stdout);
        
        recv(s,answer,sizeof(answer),0);                                                    /*riceve la risposta del server*/
        
        printf("S: %s\n",answer);                                                           /*stampa la risposta del server*/
        
        printf("\r\n");
        
        closesocket(s);                                                                     /*chiude la socket*/
        
        WSACleanup();                                                                       /*lascia la libreria delle socket per windows*/
        
        printf("Done !\r\n");                                                                   /*stampa DONE!*/
        printf("Grazie di aver mandato una email, arriverci \r\n"); 
        
        break;

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2012
    Messaggi
    18
    unisci questo
    codice:
    case 'b':
    
       if (he == NULL) 
        { 
       printf("\r\n");
       printf("host not found.\n"); 
       system("PAUSE"); 
       return 1; 
       } 
        else 
        { 
        printf("\r\n");
        printf("host found.\n");    
        } 
        
        i=0;
            
        s1 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);                              //viene costruita la socket  
        if (s1 <0)
        { printf("la socket non funziona /r/n");
        return -1;}  
        
        printf("\r\n");
        printf("\n...Connessione al server in atto...\n"); 
        
        connect(s1,(struct sockaddr*)&sin,sizeof(sin));                              //crea la connessione con il server di Google
        
        recv(s1,answer1,sizeof(answer1),0);
        printf("S: %s\n",answer1);
        
                                  send(s1,"USER  ",strlen("USER  "),0);        /*manda USER <pop.gmail.com>*/
                                  printf("------> Scrivi il tuo indirizzo email\r\n");
                                  scanf("%s",sendpop1); 
                                  send(s1,sendpop1,sizeof(sendpop1),0);
                                  send(s1,"\r\n",strlen("\r\n"),0);
                                  
        recv(s1,answer1,sizeof(answer1),0);                                           /*riceve la risposta del server */
        
        printf("S: %s\n",answer1);                                                  /*stampa la risposta */
         
        printf("\r\n");
        
        strcpy(answer1,"");
        
        strcpy(sendpop1,"");
        
                                  send(s1,"PASS ",strlen("PASS "),0);                                      /*manda PASS a <pop.gmail.com>*/
                                  printf("------> Scrivi la tua password \r\n");
                                  scanf("%s",sendpop1); 
                                  send(s1,sendpop1,sizeof(sendpop1),0);
                                  send(s1,"\r\n",strlen("\r\n"),0);
          
        
        printf("\r\n");
    
        recv(s1,answer1,sizeof(answer1),0);                                           /*riceve la risposta del server*/
        
        printf("S: %s\r\n",answer1);                                                  /*stampa la risposta del server*/
        
        printf("\r\n");
        
        strcpy(answer1,"");
        
        strcpy(sendpop1,"");
                
        send(s1,"STAT\r\n",strlen("STAT\r\n"),0);                                             /*manda STAT per mostrare la quantità delle email ricevute la grandezza dei byte*/
        printf("C: STAT\r\n");
                
        printf("\r\n");
        
        recv(s1,answer1,sizeof(answer1),0);
        
        printf("S: %s\n",answer1);
        strcpy(answer1,"");
        strcpy(sendpop1,"");
        
              printf("\r\n");
          printf("Scrivi LIST per vedere un elenco delle email ricevute,\r\n");
          printf("saranno mostrate solo alcune email\r\n");
          scanf("%s",sendpop1);
            send(s1,sendpop1,sizeof(sendpop1),0);
           send(s1,"\r\n",strlen("\r\n"),0);
        
        recv(s1,answer1,sizeof(answer1),0);
        
        printf("S: %s\r\n",answer1);        
        
        strcpy(answer1,"");
        
        printf("\r\n");
        
        
        if (strstr(answer1,str)== NULL)
        { recv(s1,answer1,sizeof(answer1),0);
          printf("S: %s\r\n",answer1);
          strcpy(answer1,"");
          }
          fflush(stdin);
          fflush(stdout);
       
          printf("Vuoi leggere una email ? Scrivi s si n no\r\n");
          fflush(stdin);
          scanf("%c",&leg);                                                         
                                     while (leg =='s' )
                                     {
    
          printf("\r\n");
          
          strcpy(sendpop1,"");
          
          strcpy(answer1,"");    
     
                                     if (leg == 's')
                                    { printf("\r\n");
                                     printf("Scrivi il numero della email che deve essere aperta\r\n");      
                                     send(s1,"RETR ",strlen("RETR "),0);
                                     scanf("%s",sendpop1);
                                     send(s1,sendpop1,sizeof(sendpop1),0);
                                     send(s1,"\r\n",strlen("\r\n"),0);
                                     strcpy(answer2,"");                                                                 
                                     
                                     recv(s1,answer2,sizeof(answer2),0);
                                     printf("S: %s\r\n",answer2);
                                     strcpy(answer2,"");
                                                                     
                                  if (strstr(answer2,str)== NULL)
                                  { recv(s1,answer2,sizeof(answer2),0);
                                   printf("S: %s\r\n",answer2);
                                   strcpy(answer2,"");
                                             }
                                     leg=' ';
                                     
                                     }
                                    strcpy(answer2,"");
                                    
                                    printf("\r\n"); 
                                    printf("Vuoi leggere una email ? Scrivi s si n no\r\n");
                                    fflush(stdin);
                                    scanf("%c",&leg);
                                  
                                    }

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Originariamente inviato da lorderon
    prova a cambiare gli indirizzi dei server in define
    Che vuoi dire? Quali dovrei usare?

    In ogni caso, in generale, nelle chiamate

    he = gethostbyname(...)

    devi subito controllare che

    he != NULL

    altrimenti qualsiasi riferimento successivo può creare un errore di segmentazione.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2012
    Messaggi
    18
    gli indirizzi di un server di pposta infatti non penso che puoi usare l'autenticazione sul sever che c'è in define prova libero oppure alice
    Pop3: in.alice.it
    Smtp: out.alice.it
    Per me l'errore è l'uso dei puntatori in sin.sin_addr.s_addr = *((unsigned long*) he->h_addr); non saprei come risolverlo, devo usare il comando malloc ?

  9. #9
    Utente di HTML.it
    Registrato dal
    Jul 2012
    Messaggi
    18
    Il comando scrive in una zona che da' errore come puo' essere evitato?

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Ti ho già detto ... secondo me il problema sta nel fatto che non controlli he dopo la gethostbyname.
    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.