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

Rispondi quotando