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