Accueil > > > POPUX PETIT CLIENT POP3 POUR POSIX
POPUX PETIT CLIENT POP3 POUR POSIX
Information sur la source
Description
POPuX, un petit client pop qui connect a un serveur pop et affiche combien de mail l'user en a dans sa boite et télécharge le contenu des maild dans un fichier popux-mail. POPux est un petit fetch mail a l'exception qu'il ne supprime pas d'email ,vous pouvez donc le testez sans risque de perdre vous mail a jamais. Vous pouvez utilisez POPuX comme une framework pour developer vous propre client car il n'est pas complet puisque il n'ya pas d'allocage dynamique de la taille des mails, donc si un mail est superieur a celui du buffer de POPuX le resultat est le crash du programme avec un(EXIT_FAILURE) comme code d'erreur. Le travail d'origine est un petit tutorial sur les winsock (donc windows) qui s'appelle popclt que vous pouvez trouvez ici: http://www.exegesis.uklinux.net/gandalf/winsock/wi nsock2.htm j'ai donc porter le code vers *nix .
Source
- // cc popuxc.c-o POPuX
-
- /***************************************************************************
- * Copyright (C) 2006 by James Mrad *
- * xtremejames183@msn.com *
- * *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- * This program is distributed in the hope that it will be useful, *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
- * GNU General Public License for more details. *
- * *
- * You should have received a copy of the GNU General Public License *
- * along with this program; if not, write to the *
- * Free Software Foundation, Inc., *
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
- ***************************************************************************/
-
- /*
- * un petit WARNING
- * Testez le client sur un vrai serveur pop dont vous n'avez pas le droit de vous connecter
- * ou vous n'avez pas la permission releve de l'illegal.
- * Vous pouvez le tester chez vous si vous avez une
- * linux box et un petit network avec un serveur POP ,tranquillement sans aucun risque de represaille.
- * L'AUTEUR N'ASSUME AUCUNE RESPONSABLITE SUR UNE UTILISATION MAILVEILLANTE OU ILLEGALES DU CODE.
- */
-
- #ifdef HAVE_CONFIG_H
- #include <config.h>
- #endif
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <unistd.h>
- #include <errno.h>
- #include <sys/socket.h>
- #include <sys/types.h>
- #include <sys/wait.h>
- #include <time.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
- #include <signal.h>
- #include <netdb.h>
-
- //taille maximum d'un mail
- #define BUF_SIZE 650000
- // pop port
- #define POP_PORT 110
- //message d'erreur du serveur
- #define ERR_MSG "-ERR"
- //log
- char * FILE_BUF;
- //buffer d'enregistrement
- char * REC_BUF;
-
- void sigchld_handler(int a)
- {
- while(waitpid(-1,NULL,WNOHANG)>0);
- }
-
- // gestion d'erreur preovenant du serveur
- void pop_msg_err();
- //log msg
- void write_log(int file_type, char *msg);
- //gestion des erreurs
- char * p_error(char *err,int id);
- //fonction pour retirer vous mail du serveur
- int retreive(int start,int end,int *sock);
-
-
- int main(int argc, char *argv[])
- {
-
-
-
- int sock; //descripteur socket
- struct sockaddr_in addr; //adresse
- struct hostent * host; //hote
- int err; //erreur socket
-
-
- char hostname[20]; //information sur le serveur
- char login[20]; //votre compte
- char password[20]; //votre pass
-
- int i,j; //compteur generale
- char tempbuf[20]=""; //chaine temporaire pour le parsing
- int num_flag=0; //un ptit flag
- time_t time_now; //de time.h
-
- /* allocage dynmaique de la mermoire du heap
- calloc au lieu de malloc*/
- FILE_BUF=calloc(BUF_SIZE,sizeof(char)+1);
- REC_BUF=calloc(BUF_SIZE,sizeof(char)+1);
-
-
- //get time
- time(&time_now);
-
- sprintf(FILE_BUF,"POPuX started on: %.24s\n",ctime(&time_now));
- write_log(1/*log file */|4/*ecran*/,FILE_BUF);
-
- // creer une socket en mode TCP/IP
- if(( sock=socket(PF_INET,SOCK_STREAM,0))<0)
- write_log(1/*log file*/|4,p_error("Socket\n",0));
-
- bzero( (char *)&addr,sizeof addr);
- addr.sin_family = AF_INET; //internet
- addr.sin_port = htons(POP_PORT); //pop port
-
- printf("Enter Hostname e.g(pop.myhostname.com): ");
- /* comme vous savez scanf()
- n'est pas la meilleur fonction que
- C offre.Pour un vrai client je prefere de loin
- fgets(hostname,sizeof(hostname),stdin);
- mais c'est pas notre vrai probleme.
- */
- scanf("%s",hostname);
- printf("Login : ");
- scanf("%s",login);
- printf("Password: ");
- scanf("%s",password);
-
- sprintf(FILE_BUF,"Connecting to %s using username: %s\n",hostname,login);
- write_log(1/*log file*/,FILE_BUF);
-
- //DNS
- if( (host=gethostbyname(hostname) )==NULL)
- write_log(1/*log file*/|4,p_error("DNS error\n",1));
-
- //addresse IP du serveur
- addr.sin_addr.s_addr=*((unsigned long *)host->h_addr);
-
- //mode connection
- if((err=connect(sock,(struct sockaddr *)&addr,sizeof(struct sockaddr)))<0)
- write_log(1/*log file*/|4,p_error("Connect\n",0));
-
- sprintf(FILE_BUF,"Connected to %s on %s\n",inet_ntoa(*((struct in_addr *)host->h_addr)),ctime(&time_now));
- write_log(1/*log file*/|4,FILE_BUF);
-
- if((err=recv(sock,REC_BUF,BUF_SIZE,0))<0)
- /*normallement si tous ce passe bien
- vous devez recevoir +OK
- sinon -ERR en cas d'echec
- */
- write_log(1/*log file*/|4/*stdout:screen*/,p_error("Recv\n",0));
-
- sprintf(FILE_BUF,"received: %s\n",REC_BUF);
- //ecrire sur le fichier popux.log
- write_log(1/*log file*/|4,FILE_BUF);
-
- if(strstr(REC_BUF,ERR_MSG)!=NULL) //chercher si ilya la chaine -ERR dans le buffer d'enregistrement
- pop_msg_err();
-
- strcpy(REC_BUF,"USER ");
- strcat(REC_BUF,login); //envoyer votre login
- strcat(REC_BUF,"\r\n");
-
- if((err=send(sock,REC_BUF,strlen(REC_BUF),0))<0)
- write_log(1/*log file*/|4/*stdout:screen*/,p_error("Send\n",0));
-
-
- sprintf(FILE_BUF,"send: %s",REC_BUF);
-
- write_log(1/*log file*/,FILE_BUF);
-
- if((err=recv(sock,REC_BUF,BUF_SIZE,0))<0) //retourne en cas de succes +OK
- write_log(1/*log file*/|4/*stdout:screen*/,p_error("Recv\n",0));
-
- sprintf(FILE_BUF,"received: %s\n",REC_BUF);
-
- write_log(1/*log file*/|4/*stdout:screen*/,FILE_BUF);
-
- if(strstr(REC_BUF,ERR_MSG)!=NULL)
- pop_msg_err();
-
- strcpy(REC_BUF,"PASS ");
- strcat(REC_BUF, password); //envoyer votre pass super secret
- strcat(REC_BUF, "\r\n");
-
- if((err=send(sock,REC_BUF,strlen(REC_BUF),0))<0)
- write_log(1/*log file*/|4/*stdout:screen*/,p_error("Send \n",0));
-
- sprintf(FILE_BUF,"send: %s",REC_BUF);
-
- write_log(1/*log file*/,FILE_BUF);
-
- if((err=recv(sock,REC_BUF,BUF_SIZE,0))<0)
- write_log(1/*log file*/|4/*stdout:screen*/,p_error("Recv \n",0));
-
- sprintf(FILE_BUF,"received: %s\n",REC_BUF); //retourne en cas de succes +OK
-
- write_log(1/*log file*/|4/*stdout:screen*/,FILE_BUF);
-
- if(strstr(REC_BUF,ERR_MSG)!=NULL) //recherche d'eventuel erreur serveur
- pop_msg_err();
-
- strcpy(REC_BUF,"STAT\r\n"); //envoyer la commande STAT
- if((err=send(sock,REC_BUF,strlen(REC_BUF),0)<0))
- write_log(1/*log file*/|4/*stdout:screen*/,p_error("Send \n",0));
-
- sprintf(FILE_BUF,"Send %s\n",REC_BUF);
- write_log(1,FILE_BUF);
-
- if((err=recv(sock,REC_BUF,strlen(REC_BUF),0))<0)
- write_log(1/*log file*/|4/*stdout:screen*/,p_error("Recv \n",0));
-
- sprintf(FILE_BUF,"received: %s\n",REC_BUF);
- write_log(1,FILE_BUF);
-
- if(strstr(REC_BUF,ERR_MSG)!=NULL)
- pop_msg_err();
-
- /* les choses serieuse commence
- * vous recevrez normallement +OK X Y ou X est le nombre de mail que vous avez
- * et Y leur taille en octets. NB: le buffer qu'on a allouer
- * ne serais pas suffisant pour un vrai client pop .
- * il devrez etre dynamiquement allouez apres avoir
- * determiner la taille de vos mail en attente
- */
- i=j=0;
- //combien de mail on a
- while(i) {
-
- if( REC_BUF[i]> '0' && REC_BUF[i] )
- {
-
- while( REC_BUF[i] != ' ') {
-
- tempbuf[j]=REC_BUF[i];
-
- j++;
-
- i++;
- }
- num_flag=1;
-
- tempbuf[j]='\0';
- }
-
- i++;
- }
- i=atoi(tempbuf); //nombre d'email
-
- printf("There are %d waiting for you\nRetreive messages Now(Y/N) ",i);
-
- char c=getchar();
-
- while(c!='n'&&c=='y')
- {
-
- if(!retreive(j,i,&sock))
- printf("Everything Done..Open mail-popux to view received mail.\n");
- else
- printf("An error Occured See popux.log for details\n");
- c='n';
- }
- // faire le nettoyage et quitter
- strcpy(REC_BUF,"QUIT\r\n");
-
- if(err=send(sock,REC_BUF,strlen(REC_BUF),0)<0)
- write_log(1|4,p_error("Send\n",0));
-
- sprintf(FILE_BUF,"Send %s\n",REC_BUF);
- write_log(1,FILE_BUF);
-
- printf("Cleaning...\n");
-
- free(FILE_BUF);
- free(REC_BUF);
-
- #ifdef WIN32
- WSACleanup();
- getch();
- #endif
-
- return EXIT_SUCCESS;
-
- }
- void pop_msg_err()
- {
- printf("POPuX: The POP sever returned an error msg Check popux.log for details\n");
- #ifdef WIN32
- WSACleanUp();
- getch();
- #endif
- exit(EXIT_SUCCESS);
- }
- //log msg
- void write_log(int file_type, char *msg)
-
- {
- const int to_log=1;
- const int to_mail=2;
- const int to_printf=4;
- if ( (file_type & to_log)!=0 )
- {
- FILE *fp=fopen("popux.log","a+");
- if(!fp) {
- perror("POPuX\n");
- exit(EXIT_FAILURE);
- }
- fprintf(fp,"%s\n",msg);
- fclose(fp);
- }
- if( (file_type & to_mail) !=0)
- {
- FILE *fp=fopen("mail-popux","a+");
- if(!fp) {
- perror("POPuX\n");
- exit(EXIT_FAILURE);
- }
- fprintf(fp,"%s\n",msg);
- fclose(fp);
- }
- if( (file_type & to_printf) !=0)
- {
- printf("%s\n",msg);
- }
-
- }
- char * p_error(char *err,int id)
- {
- // gestion d'erreur
- if(!id)//id==0
- perror(err);
- else
- herror(err); //pour les erreurs DNS
-
- return err;
- }
-
- //Fetcher vos mails
- int retreive(int start,int end,int *sock)
- {
-
- const int TO_MAIL=2;
- /* LE VRAI PROBLEME
- * A ce point on devrez OBTENIR la taille de chaque email en attente
- * sur le serveur POP et allocer dynamiquement de la mémoire, ou essayer
- * de synchronizer l'acces.
- * Jusqu'a ici, laissons le code simple. Si vous
- * avez un email supperieur a celui du buffer(BUF_SIZE), vous assistez a un joli
- * crash du programme!
- */
-
- for(start=1;start<=end;start++)
- {
- sprintf(REC_BUF,"RETR %d\r\n",start);
- printf("Retreiving msg number %d\n",start);
-
- if(send(*sock,REC_BUF,strlen(REC_BUF),0)<0) //envoyer la commande RETR au serveur
- {
- write_log(1/*log file*/|4,p_error("Send\n",0));
- return -1; //error code
- }
- sprintf(FILE_BUF,"Sent %s\n",REC_BUF);
- write_log(1,FILE_BUF);
-
- if(recv(*sock,REC_BUF,BUF_SIZE,0)<0); //+OK en cas de succes
- {
- write_log(1/*log file*/|4,p_error("Recv\n",0));
- return -1; //error code
- }
- sprintf(FILE_BUF,"received: %s ",REC_BUF);
- write_log(1,FILE_BUF);
-
- if(strstr(REC_BUF,ERR_MSG)!=NULL) // ou cas une erreur c'est produite
- pop_msg_err();
-
- if(recv(*sock,REC_BUF,BUF_SIZE,0)<0) // enfin on retire le mail
- {
- write_log(1|4,p_error("recv\n",0));
- return -1;
- }
- sprintf(FILE_BUF,"%s\n",REC_BUF);
- write_log(TO_MAIL/*ecrire le mail sur le fichier Mail-popux*/,FILE_BUF);
-
- }
- return 0; //fin
-
- }
// cc popuxc.c-o POPuX
/***************************************************************************
* Copyright (C) 2006 by James Mrad *
* xtremejames183@msn.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
/*
* un petit WARNING
* Testez le client sur un vrai serveur pop dont vous n'avez pas le droit de vous connecter
* ou vous n'avez pas la permission releve de l'illegal.
* Vous pouvez le tester chez vous si vous avez une
* linux box et un petit network avec un serveur POP ,tranquillement sans aucun risque de represaille.
* L'AUTEUR N'ASSUME AUCUNE RESPONSABLITE SUR UNE UTILISATION MAILVEILLANTE OU ILLEGALES DU CODE.
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <time.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <signal.h>
#include <netdb.h>
//taille maximum d'un mail
#define BUF_SIZE 650000
// pop port
#define POP_PORT 110
//message d'erreur du serveur
#define ERR_MSG "-ERR"
//log
char * FILE_BUF;
//buffer d'enregistrement
char * REC_BUF;
void sigchld_handler(int a)
{
while(waitpid(-1,NULL,WNOHANG)>0);
}
// gestion d'erreur preovenant du serveur
void pop_msg_err();
//log msg
void write_log(int file_type, char *msg);
//gestion des erreurs
char * p_error(char *err,int id);
//fonction pour retirer vous mail du serveur
int retreive(int start,int end,int *sock);
int main(int argc, char *argv[])
{
int sock; //descripteur socket
struct sockaddr_in addr; //adresse
struct hostent * host; //hote
int err; //erreur socket
char hostname[20]; //information sur le serveur
char login[20]; //votre compte
char password[20]; //votre pass
int i,j; //compteur generale
char tempbuf[20]=""; //chaine temporaire pour le parsing
int num_flag=0; //un ptit flag
time_t time_now; //de time.h
/* allocage dynmaique de la mermoire du heap
calloc au lieu de malloc*/
FILE_BUF=calloc(BUF_SIZE,sizeof(char)+1);
REC_BUF=calloc(BUF_SIZE,sizeof(char)+1);
//get time
time(&time_now);
sprintf(FILE_BUF,"POPuX started on: %.24s\n",ctime(&time_now));
write_log(1/*log file */|4/*ecran*/,FILE_BUF);
// creer une socket en mode TCP/IP
if(( sock=socket(PF_INET,SOCK_STREAM,0))<0)
write_log(1/*log file*/|4,p_error("Socket\n",0));
bzero( (char *)&addr,sizeof addr);
addr.sin_family = AF_INET; //internet
addr.sin_port = htons(POP_PORT); //pop port
printf("Enter Hostname e.g(pop.myhostname.com): ");
/* comme vous savez scanf()
n'est pas la meilleur fonction que
C offre.Pour un vrai client je prefere de loin
fgets(hostname,sizeof(hostname),stdin);
mais c'est pas notre vrai probleme.
*/
scanf("%s",hostname);
printf("Login : ");
scanf("%s",login);
printf("Password: ");
scanf("%s",password);
sprintf(FILE_BUF,"Connecting to %s using username: %s\n",hostname,login);
write_log(1/*log file*/,FILE_BUF);
//DNS
if( (host=gethostbyname(hostname) )==NULL)
write_log(1/*log file*/|4,p_error("DNS error\n",1));
//addresse IP du serveur
addr.sin_addr.s_addr=*((unsigned long *)host->h_addr);
//mode connection
if((err=connect(sock,(struct sockaddr *)&addr,sizeof(struct sockaddr)))<0)
write_log(1/*log file*/|4,p_error("Connect\n",0));
sprintf(FILE_BUF,"Connected to %s on %s\n",inet_ntoa(*((struct in_addr *)host->h_addr)),ctime(&time_now));
write_log(1/*log file*/|4,FILE_BUF);
if((err=recv(sock,REC_BUF,BUF_SIZE,0))<0)
/*normallement si tous ce passe bien
vous devez recevoir +OK
sinon -ERR en cas d'echec
*/
write_log(1/*log file*/|4/*stdout:screen*/,p_error("Recv\n",0));
sprintf(FILE_BUF,"received: %s\n",REC_BUF);
//ecrire sur le fichier popux.log
write_log(1/*log file*/|4,FILE_BUF);
if(strstr(REC_BUF,ERR_MSG)!=NULL) //chercher si ilya la chaine -ERR dans le buffer d'enregistrement
pop_msg_err();
strcpy(REC_BUF,"USER ");
strcat(REC_BUF,login); //envoyer votre login
strcat(REC_BUF,"\r\n");
if((err=send(sock,REC_BUF,strlen(REC_BUF),0))<0)
write_log(1/*log file*/|4/*stdout:screen*/,p_error("Send\n",0));
sprintf(FILE_BUF,"send: %s",REC_BUF);
write_log(1/*log file*/,FILE_BUF);
if((err=recv(sock,REC_BUF,BUF_SIZE,0))<0) //retourne en cas de succes +OK
write_log(1/*log file*/|4/*stdout:screen*/,p_error("Recv\n",0));
sprintf(FILE_BUF,"received: %s\n",REC_BUF);
write_log(1/*log file*/|4/*stdout:screen*/,FILE_BUF);
if(strstr(REC_BUF,ERR_MSG)!=NULL)
pop_msg_err();
strcpy(REC_BUF,"PASS ");
strcat(REC_BUF, password); //envoyer votre pass super secret
strcat(REC_BUF, "\r\n");
if((err=send(sock,REC_BUF,strlen(REC_BUF),0))<0)
write_log(1/*log file*/|4/*stdout:screen*/,p_error("Send \n",0));
sprintf(FILE_BUF,"send: %s",REC_BUF);
write_log(1/*log file*/,FILE_BUF);
if((err=recv(sock,REC_BUF,BUF_SIZE,0))<0)
write_log(1/*log file*/|4/*stdout:screen*/,p_error("Recv \n",0));
sprintf(FILE_BUF,"received: %s\n",REC_BUF); //retourne en cas de succes +OK
write_log(1/*log file*/|4/*stdout:screen*/,FILE_BUF);
if(strstr(REC_BUF,ERR_MSG)!=NULL) //recherche d'eventuel erreur serveur
pop_msg_err();
strcpy(REC_BUF,"STAT\r\n"); //envoyer la commande STAT
if((err=send(sock,REC_BUF,strlen(REC_BUF),0)<0))
write_log(1/*log file*/|4/*stdout:screen*/,p_error("Send \n",0));
sprintf(FILE_BUF,"Send %s\n",REC_BUF);
write_log(1,FILE_BUF);
if((err=recv(sock,REC_BUF,strlen(REC_BUF),0))<0)
write_log(1/*log file*/|4/*stdout:screen*/,p_error("Recv \n",0));
sprintf(FILE_BUF,"received: %s\n",REC_BUF);
write_log(1,FILE_BUF);
if(strstr(REC_BUF,ERR_MSG)!=NULL)
pop_msg_err();
/* les choses serieuse commence
* vous recevrez normallement +OK X Y ou X est le nombre de mail que vous avez
* et Y leur taille en octets. NB: le buffer qu'on a allouer
* ne serais pas suffisant pour un vrai client pop .
* il devrez etre dynamiquement allouez apres avoir
* determiner la taille de vos mail en attente
*/
i=j=0;
//combien de mail on a
while(i) {
if( REC_BUF[i]> '0' && REC_BUF[i] )
{
while( REC_BUF[i] != ' ') {
tempbuf[j]=REC_BUF[i];
j++;
i++;
}
num_flag=1;
tempbuf[j]='\0';
}
i++;
}
i=atoi(tempbuf); //nombre d'email
printf("There are %d waiting for you\nRetreive messages Now(Y/N) ",i);
char c=getchar();
while(c!='n'&&c=='y')
{
if(!retreive(j,i,&sock))
printf("Everything Done..Open mail-popux to view received mail.\n");
else
printf("An error Occured See popux.log for details\n");
c='n';
}
// faire le nettoyage et quitter
strcpy(REC_BUF,"QUIT\r\n");
if(err=send(sock,REC_BUF,strlen(REC_BUF),0)<0)
write_log(1|4,p_error("Send\n",0));
sprintf(FILE_BUF,"Send %s\n",REC_BUF);
write_log(1,FILE_BUF);
printf("Cleaning...\n");
free(FILE_BUF);
free(REC_BUF);
#ifdef WIN32
WSACleanup();
getch();
#endif
return EXIT_SUCCESS;
}
void pop_msg_err()
{
printf("POPuX: The POP sever returned an error msg Check popux.log for details\n");
#ifdef WIN32
WSACleanUp();
getch();
#endif
exit(EXIT_SUCCESS);
}
//log msg
void write_log(int file_type, char *msg)
{
const int to_log=1;
const int to_mail=2;
const int to_printf=4;
if ( (file_type & to_log)!=0 )
{
FILE *fp=fopen("popux.log","a+");
if(!fp) {
perror("POPuX\n");
exit(EXIT_FAILURE);
}
fprintf(fp,"%s\n",msg);
fclose(fp);
}
if( (file_type & to_mail) !=0)
{
FILE *fp=fopen("mail-popux","a+");
if(!fp) {
perror("POPuX\n");
exit(EXIT_FAILURE);
}
fprintf(fp,"%s\n",msg);
fclose(fp);
}
if( (file_type & to_printf) !=0)
{
printf("%s\n",msg);
}
}
char * p_error(char *err,int id)
{
// gestion d'erreur
if(!id)//id==0
perror(err);
else
herror(err); //pour les erreurs DNS
return err;
}
//Fetcher vos mails
int retreive(int start,int end,int *sock)
{
const int TO_MAIL=2;
/* LE VRAI PROBLEME
* A ce point on devrez OBTENIR la taille de chaque email en attente
* sur le serveur POP et allocer dynamiquement de la mémoire, ou essayer
* de synchronizer l'acces.
* Jusqu'a ici, laissons le code simple. Si vous
* avez un email supperieur a celui du buffer(BUF_SIZE), vous assistez a un joli
* crash du programme!
*/
for(start=1;start<=end;start++)
{
sprintf(REC_BUF,"RETR %d\r\n",start);
printf("Retreiving msg number %d\n",start);
if(send(*sock,REC_BUF,strlen(REC_BUF),0)<0) //envoyer la commande RETR au serveur
{
write_log(1/*log file*/|4,p_error("Send\n",0));
return -1; //error code
}
sprintf(FILE_BUF,"Sent %s\n",REC_BUF);
write_log(1,FILE_BUF);
if(recv(*sock,REC_BUF,BUF_SIZE,0)<0); //+OK en cas de succes
{
write_log(1/*log file*/|4,p_error("Recv\n",0));
return -1; //error code
}
sprintf(FILE_BUF,"received: %s ",REC_BUF);
write_log(1,FILE_BUF);
if(strstr(REC_BUF,ERR_MSG)!=NULL) // ou cas une erreur c'est produite
pop_msg_err();
if(recv(*sock,REC_BUF,BUF_SIZE,0)<0) // enfin on retire le mail
{
write_log(1|4,p_error("recv\n",0));
return -1;
}
sprintf(FILE_BUF,"%s\n",REC_BUF);
write_log(TO_MAIL/*ecrire le mail sur le fichier Mail-popux*/,FILE_BUF);
}
return 0; //fin
}
Conclusion
Voila j'attends vos critique,commentaire... surtout sur l'allocage dynamique de la taille des messagess. Dans le zip vous trouver le code mais les commentaires sont en anglais car je dois poster sur planet-code. A+.
Historique
- 16 octobre 2006 17:55:56 :
- Mise a jour du code
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
programmation socket sous linux [ par blazman34 ]
Bonjour à tous !!Voici mon probleme :Je suis en train de programmer une application client serveur sous linux, tout a bien marcher juska présent juska
Etat Socket Linux [ par cybermax62 ]
Existe-t-il un moyen de connaître sur un server (socket,C) l'état d'un connection client (socket,C) utilisant le protocole SOCK_STREAM ? Act
Soket sous LINUX [ par diablo31170 ]
Bonjour à tous le monde, comme le nom l'indique, cela va parler de soscket sous linux (en C++). Il aut savoir que je travaille en mode connect
[C] Un timeOut sur Socket en détails [Linux] [ par ZedMaTrix ]
Salut a tous.Bon j'ai pas mal cherché sur le site, et appart des débuts de réponses, je n'ai rien trouvé qui m'ai aidé à résoudre ce problème de TimeO
Meilleur Socket multi-client [ par Mick7 ]
salut, je voudrais savoir qu'elle est la meilleur façon de creer des socket multi-client parceque j'ai entendu parler des Threads, de WSA et je c
API + logiciel réseau [ par lolorenzeb ]
Bonjour à tous,Voila j'ai réalisé deux petites applications simples (client et serveur) en mode console. Je souhaite donc améliorer mon programme avec
probleme socket + API ( +thread ?) [ par lolorenzeb ]
Bonjour à tous,Voila j'avais deja poster dans un précédent sujet mais comme j'ai revu tout mon code cela va etre plus simple de répondre. J'ai donc cr
socket linux windows [ par Aozora ]
BOnjour j'aurai voulu savoir s'il existait un code dans lequel je pourrais trouver un srveur windows et un client linux, me permettant de créer u
[C] Connexion à MsSQL sous Linux [ par ZedMaTrix ]
Salut les codeurs !Voila, je suis interessé par le developpement d'un client SQL.La cible de mon programme est un serveur MS-SQL.Bon pour le moment, s
Identifier un Client via Socket IP - C++ [ par Jeff_Trek ]
Bonjour,J'utilise un Serveur (Socket IP), J'aimerais identifier les clients qui se connecte et déconnecte.Je connais les adresses IP des clients.Si Cl
|
Derniers Blogs
SESSION SILVERLIGHT 5 3D : SLIDES ET DEMOSSESSION SILVERLIGHT 5 3D : SLIDES ET DEMOS par Groc
Durant les techdays, j'ai eu le plaisir d'animer une session sur Silverlight 5 et la 3D avec Simon Ferquel. Comme promis, voici nos slides et mes démos (celles avec le viper BSG) ici et là. Pour mémoire, les démos utilisent toutes le viper BSG...
Cliquez pour lire la suite de l'article par Groc [TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES[TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES par gpommier
Suite à la session que j'ai présenté sur WebMatrix 2, vous pouvez trouver les slides ici, ainsi que les démos en packages nuget : démos1 et démos2 J'en profite pour remercier chaleureusement tous ceux qui sont venus très nombreux à cette sess...
Cliquez pour lire la suite de l'article par gpommier [SHAREPOINT] LES SESSIONS TECHDAYS 2012.[SHAREPOINT] LES SESSIONS TECHDAYS 2012. par Patrick Guimonet
Voici donc pour ceux qui n'ont pas pu venir, ou ceux qui n'ont pas pu toutes les suivre la liste des sessions SharePoint aux TechDays 2012, que je mettrais à jour dès que les liens des vidéo seront disponibles. Ou ici : http...
Cliquez pour lire la suite de l'article par Patrick Guimonet TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3 par ROMELARD Fabrice
Speaker: Bernard Ourghanlian Cette session est comme chaque jour transmise en live par BrainSonic, et j'ai donc suivi cette troisième pleinière par ce moyen sur mon iPad . Elle est dédiée comme chaque année à la mise en perspective de l'é...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE !MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE ! par Vko
Hier durant une session dédiée aux Techdays 2012, j'ai eu le plaisir d'annoncer la sortie de la Béta 2 de Mishra Reader. C'est quoi ? Pour les utilisateurs, c'est une vraie expérience de lecture de flux RSS sur Windows. Rien à voir avec les produit...
Cliquez pour lire la suite de l'article par Vko
Logiciels
Tribler (2012)TRIBLER (2012)Tribler est un client pair à pair (P2P/Peer-to-Peer) open source avec la capacité de regarder des... Cliquez pour télécharger Tribler OneSwarm (2012)ONESWARM (2012)Le peer-to-peer qui protège votre vie privée, c'est OneSwarm.
Ce logiciel de peer-to-peer crypté... Cliquez pour télécharger OneSwarm PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning
|