Programme en c

[Fermé]
Signaler
-
Messages postés
29984
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
26 juillet 2021
-
bonjour
j'ai essayé d'ecrire un programmme en c pour envoi de mail mais ça marche pas et je sais pas ou est le problème

mon programme se base sur des comparaisons de chaines de caractères et read et write(socket domaine AF_INET) pourquoi ça marche pas je sais pas voici le programme:
#include<stdio.h>
#include<sys/types.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<string.h>
#define MAXLINE 80
main()


{
char chaine1[MAXLINE+1]="HELO localhost.projetA.ma\0";
char chaine2[MAXLINE+1]="MAIL FROM:<root@projetA.ma\0";
char chaine3[MAXLINE+1]="RCPT TO:<nada@projetA.ma>\0";
char chaine4[MAXLINE+1]="DATA\0";
char chaine5[MAXLINE+1]="vous etes cible de spams\0";
char chaine6[MAXLINE+1]=". \0";
char chaine7[MAXLINE+1]="QUIT";

fprintf(stderr,"1");
int sockfd;
struct sockaddr_in serv_addr;
char adresse_ip[20];
char sendline[MAXLINE],recvline[MAXLINE + 1];
int n;
bzero((char *) &serv_addr,sizeof(serv_addr));
serv_addr.sin_family =AF_INET;
serv_addr.sin_port=htons(25);
serv_addr.sin_addr.s_addr=inet_addr("172.16.30.1");
if((sockfd = socket(AF_INET,SOCK_STREAM,0))<0)
{fprintf(stderr,"\n client : socket erreur");
exit(2);
}
fprintf(stderr,"2");
if (connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr))<0)
{fprintf(stderr,"client: connect erreur \n");
exit(3);
}

fprintf(stderr,"3");

while(1)
{
n=read(sockfd,recvline,sizeof(recvline)+1);
fprintf(stderr,recvline);
fprintf(stderr,"5");
if(strstr(recvline,"220")!=NULL)
{fprintf(stderr,"6");
write(sockfd,chaine1,sizeof(chaine1));
fprintf(stderr,"7");


}
fprintf(stderr,recvline);
if(strstr(recvline,"sender ok")!=NULL)
{
fprintf(stderr,"7");
write(sockfd,chaine3,sizeof(chaine3));
fprintf(stderr,"7");
}
if(strstr(recvline,"Recipient ok")!=NULL)
{write(sockfd,chaine4,sizeof(chaine4));
fprintf(stderr,"8");
}

if(strstr(recvline,"by itself")!=NULL)
{ fprintf(stderr,"9");
write(sockfd,chaine5,sizeof(chaine5));
}
write(sockfd,chaine6,sizeof(chaine6));
if(strstr(recvline,"delivery")!=NULL)
{
fprintf(stderr,"10");
write(sockfd,chaine7,sizeof(chaine7));
}

}

shutdown(sockfd,0);
close(sockfd);
exit(0);
}



merci pour toute aide

5 réponses

Messages postés
29984
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
26 juillet 2021
7 141
Corrige ces quelques warnings déjà
gcc -W -Wall plop.c
plop.c:11: attention : le type du retour est « int » par défaut
plop.c: In function `main':
plop.c:29: attention : déclaration implicite de la fonction « inet_addr »
plop.c:44: attention : déclaration implicite de la fonction « read »
plop.c:49: attention : déclaration implicite de la fonction « write »
plop.c:80: attention : déclaration implicite de la fonction « close »
plop.c:13: attention : variable inutilisée « chaine2 »
plop.c:23: attention : variable inutilisée « adresse_ip »
plop.c:24: attention : variable inutilisée « sendline »
bonjour
merci pour la rèponce,je doit ajouter que je travail sous unix,(redhat ) et le but est d'envoyer un mail par socket client,la socket serveur est un démon "sendmail" qui est en écoute sur le port 25

merci pour votre aide
Messages postés
29984
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
26 juillet 2021
7 141
1) Ajoute un :
#include <unistd.h>
#include <arpa/inet.h>

en début de fichier.

2) Tu peux supprimer lignes 13,23,24 les variables chaine2 adresse_ip,sendline.

3) Change tes "exit(n);" par "return n;" en remplaçant n par l'entier adequat.

4) Change "main(){" par "int main(){ "

Dis-moi si ça marche mieux et à quelle étape ça bloque (chez moi entre 2 et 3)
merci mamiemando

normalement ça bloque à l'étape 7,peut etre que vous n'avez pas le sendmail dans votre pc,et il faut bien sur changer l'adresse ip

merci
Messages postés
29984
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
26 juillet 2021
7 141
Ca doit être ça en effet ;) Tu peux me tutoyer au fait, malgré mon age avancé (voix chevrotante) ;o).

Tu as essayé les modifs ci-dessus ? Tu es sûr que ta socket est bien ouverte (la programmation réseau c'est pas mon fort malheureusement :( ) ?

Sinon essaye de voir avec gdb où ca bloque (compile au préalable avec l'option -g pour gcc). Mets un break qq lignes avant le bloquage (br no_de_ligne), lance le prgramme (r), et avance pas à pas (n, s). Tape bt pour voir l'environnement dans lequel tu te trouves. Peut être que ça t'aidera...

Je ne peux malheureusement pas poussé les tests sur ma machine :(