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(); 


 }