Connexion au serveur smtp avec socket en c

fanowine Messages postés 22 Statut Membre -  
fanowine Messages postés 22 Statut Membre -
Bonjour,
les gars je n'arrive pas a me connecter au serveur SMTP en langage c
j'utilise les sockets
mais je n'arrive pas a établir la connexion avec le serveur
j'utilise l'adresse ip "77.238.184.86" au port 25
pourtant tout se passe bien avec telnet sur l'invite
en langage c la commande <system (telnet smtp.mail.yahoo.fr 25)>
me connecte avec le serveur mais aucune instruction ne peu s'ensuivre si le serveur ne se déconnecte pas

3 réponses

  1. Nabla's Messages postés 18201 Date d'inscription   Statut Contributeur Dernière intervention   3 228
     
    au lieu de parler des erreurs, files ton code
    0
  2. Nabla's Messages postés 18201 Date d'inscription   Statut Contributeur Dernière intervention   3 228
     
    ha, et faut utiliser les sockets, pas passer par les commandes telnet pour ton progrmme C. Telnt, c'estpour tes tests à la mano"
    0
  3. fanowine Messages postés 22 Statut Membre 1
     
    #include <winsock2.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    #include <string.h>

    void init(void);//la fonction d'entête pour permettre la création connection pour les SE windows

    void end(void);//la fonction de fin pour la fermeture connection pour les SE windows

    void decoupemail(void);// fonction qui permet le découpage de l'email pour
    //identifier le nom de l'identiiant et le gestionnaire des mail de l'utilisateur

    void videvect (char t[],int a);//affecter les caracteres vide a un vecteur de caractères

    void vectnul (int t[],int a);// cette fonction affete les zeros dans tout vecteur d'entier

    void base64 (char nom[]);//la fonction qui effectu la convertion d'un vecteur de caractère en vecteur
    //en base 64

    char convertion (int b);//la fonction de correspondance entre une valeur entiere et le caractère de la base 64

    void convertascii (int a);//la fonction de convertion d'un entier en binaire de 8 bits

    void ajoutvect (char ta[],int a,char tb[],int b,int c);// la fonction de concatenation de parti de vecteur

    char vecbase[50],mpass[20]="medecin",adress[24]="edwinefam2001@yahoo.fr";
    char user[30],gestmail[20];
    int nblettre=0,t[8];

    int main ()
    {
    init();

    SOCKADDR_IN sin;
    SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);//open socket
    char mess[50],mess1[50],mess2[50],mess3[50],mess4[50];
    int n = 0,choix;
    char contact[12]="ehlo smtp",identifiant[30]="autplain ",expediteur[30]="mail from: ";
    char destadress[25],suj[15],contenu[50];
    char recepteur[30]="mail to: ",sujet[20]="subjet: ",donnes[6]="data :";
    char connexion[30]="smtp.mail.",vide[3]=" ",quitter[6]="quit",conserver[6]="noop";

    decoupemail();
    strcat (connexion,gestmail);
    ajoutvect (user,nblettre,vide,0,1);
    ajoutvect (user,nblettre+1,mpass,0,strlen(mpass));
    base64 (user);
    strcat (identifiant,vecbase);
    strcat (expediteur,adress);

    if(sock == INVALID_SOCKET)
    {
    perror("socket()");
    printf (" \n ouverture incorect du socket\n ");
    system ("pause");
    return 1; /* Creation du socket a echouer */
    }
    printf ("\nsocket est maintenant ouvert \n");

    sin.sin_addr.s_addr = inet_addr("127.0.0.2");
    sin.sin_port = htons (3113);
    sin.sin_family = AF_INET;
    // se connecter a server
    if ( connect(sock, (SOCKADDR *)&sin, sizeof sin) == SOCKET_ERROR )
    {
    perror("Error: connect");
    printf (" \n pas connecter au serveur \n");
    system ("pause");
    return 1;
    }

    printf ( "\n Vous etes maintenant connecter au serveur \n");

    // envoi de donnees
    if(send(sock,contact, strlen(contact), 0) < 0)
    {
    perror("send()");
    printf (" \n l'envoi de message a echouer\n ");
    system ("pause");
    return 1; /* l'envoi a echouer */
    }
    else
    printf (" \n l'envoi de message salut du serveur\n ");

    //recevoir donner
    if((n = recv(sock, mess, sizeof mess - 1, 0)) < 0)
    {
    perror("recv()");
    printf (" \n la reception de message a echouer\n ");
    system ("pause");
    return 1; /* la reception a echouer */
    }
    else
    {
    printf (" \n reception de message OK\n ");
    printf (" \n le message est \t %s\n ",mess);
    }

    // envoi de donnees
    if(send(sock,identifiant, strlen(identifiant), 0) < 0)
    {
    perror("send()");
    printf (" \n l'envoi de message a echouer\n ");
    system ("pause");
    return 1; /* l'envoi a echouer */
    }
    else
    printf (" \n l'envoi de message d'identification\n ");

    //recevoir donner
    if((n = recv(sock, mess1, sizeof mess1 - 1, 0)) < 0)
    {
    perror("recv()");
    printf (" \n la reception de message a echouer\n ");
    system ("pause");
    return 1; /* la reception a echouer */
    }
    else
    {
    printf (" \n reception de message OK\n ");
    printf (" \n le message est \t %s\n ",mess1);
    }

    do
    {
    printf ("\n entrer l'adresse du recepteur du message :\t ");
    fgets (destadress,sizeof (destadress),stdin);
    strcat(recepteur,destadress);

    // envoi de donnees
    if(send(sock,expediteur, strlen(expediteur), 0) < 0)
    {
    perror("send()");
    printf (" \n l'envoi de message a echouer\n ");
    system ("pause");
    return 1; /* l'envoi a echouer */
    }
    else
    printf (" \n l'envoi de l'expediteur du message\n ");

    //recevoir donner
    if((n = recv(sock, mess2, sizeof mess2 - 1, 0)) < 0)
    {
    perror("recv()");
    printf (" \n la reception de message a echouer\n ");
    system ("pause");
    return 1; /* la reception a echouer */
    }
    else
    {
    printf (" \n reception de message OK\n ");
    printf (" \n le message est \t %s\n ",mess2);
    }

    // envoi de donnees
    if(send(sock,recepteur, strlen(recepteur), 0) < 0)
    {
    perror("send()");
    printf (" \n l'envoi de message a echouer\n ");
    system ("pause");
    return 1; /* l'envoi a echouer */
    }
    else
    printf (" \n l'envoi de l'adresse du destinateur du message\n ");

    //recevoir donner
    if((n = recv(sock, mess3, sizeof mess3 - 1, 0)) < 0)
    {
    perror("recv()");
    printf (" \n la reception de message a echouer\n ");
    system ("pause");
    return 1; /* la reception a echouer */
    }
    else
    {
    printf (" \n reception de message OK\n ");
    printf (" \n le message est \t %s\n ",mess3);
    }

    printf ("\n entrer le titre du message a envoyer :\t ");
    fgets (suj,sizeof(suj),stdin);
    strcat(sujet,suj);

    // envoi de donnees
    if(send(sock,sujet, strlen(sujet), 0) < 0)
    {
    perror("send()");
    printf (" \n l'envoi de message a echouer\n ");
    system ("pause");
    return 1; /* l'envoi a echouer */
    }
    else
    printf (" \n l'envoi de l'adresse du destinateur du message\n ");

    // envoi de donnees
    if(send(sock,donnes, strlen(donnes), 0) < 0)
    {
    perror("send()");
    printf (" \n l'envoi de message a echouer\n ");
    system ("pause");
    return 1; /* l'envoi a echouer */
    }
    else
    printf (" \n l'envoi du contenu du message\n ");

    printf ("\n entrer le contenu du message :\t ");
    fgets (contenu,sizeof(contenu),stdin);
    // envoi de donnees
    if(send(sock,contenu, strlen(contenu), 0) < 0)
    {
    perror("send()");
    printf (" \n l'envoi de message a echouer\n ");
    system ("pause");
    return 1; /* l'envoi a echouer */
    }
    else
    printf (" \n l'envoi du contenu du message\n ");

    //recevoir donner
    if((n = recv(sock, mess4, sizeof mess4 - 1, 0)) < 0)
    {
    perror("recv()");
    printf (" \n la reception de message a echouer\n ");
    system ("pause");
    return 1; /* la reception a echouer */
    }
    else
    {
    printf (" \n reception de message OK\n ");
    printf (" \n le message est \t %s\n ",mess4);
    }

    do
    {
    system("cls");
    printf ("\n \t \t CHOISIR :\n");
    printf ("\n \t 1 --> POUR ENVOYER UN AUTRE MESSAGE");
    printf ("\n \t 2 --> POUR RETOURNER A L'ACCUEIL");
    printf ("\n \t 3 --> POUR SE DECONNECTER \n");
    scanf ("%d",&choix);
    }while ((choix>3)||(choix<1));

    if ((choix==3)||(choix==2))
    {
    // envoi de donnees
    if(send(sock,quitter, strlen(quitter), 0) < 0)
    {
    perror("send()");
    printf (" \n l'envoi de message a echouer\n ");
    system ("pause");
    return 1; /* l'envoi a echouer */
    }
    else
    printf (" \n l'envoi de message de sortie OK\n ");

    if (choix==3)
    exit (1);
    }
    else
    {
    // envoi de donnees
    if(send(sock,conserver, strlen(conserver), 0) < 0)
    {
    perror("send()");
    printf (" \n l'envoi de message a echouer\n ");
    system ("pause");
    return 1; /* l'envoi a echouer */
    }
    else
    printf (" \n l'envoi du message de conservation \n ");

    }

    }while (choix==1);

    // fermer socket
    closesocket(sock);

    end();

    system ("pause");
    return 1;
    }
    //////////////////////////////////////////////////////////////////////////////
    void init(void)
    {
    WSADATA wsa;
    int err = WSAStartup(MAKEWORD(2, 2), &wsa);
    if(err < 0)
    {
    puts("WSAStartup failed !");
    exit(EXIT_FAILURE);
    }
    }
    ////////////////////////////////////////////////////////////////////////////
    void end(void)
    {
    WSACleanup();
    }
    ///////////////////////////////////////////////////////////////////////
    void videvect (char t[],int a)
    {
    int i;

    for (i=0;i<a;i++)
    t[i]=' ';
    }

    //////////////////////////////////////////////////////////////////////
    void decoupemail(void)
    {
    int i,j;

    i=0;
    videvect (user,30);
    videvect (gestmail,30);

    while (adress[i] != '@')
    {
    user[i]=adress[i];
    i=i+1;
    }
    nblettre=i;
    i=i+1;
    j=0;
    while (i < strlen(adress))
    {
    gestmail[j]=adress[i];
    i=i+1;
    j=j+1;
    }
    //nblettre1=j;
    }
    //////////////////////////////////////////////////////////////
    void ajoutvect (char ta[],int a,char tb[],int b,int c)
    {
    int i,j=0;

    for (i=a;i<=(a+c);i++)
    {
    ta[i]=tb[b+j];
    j=j+1;
    }
    }
    ///////////////////////////////////////////////////////////////
    void vectnul (int t[],int a)
    {
    int i;

    for (i=0;i<a;i++)
    t[i]=0;
    }
    ////////////////////////////////////////////////////////////////
    void convertascii (int a)
    {
    int i,b,d;

    for (i=0;i<8;i++)
    t[i]=0;
    b=a;
    i=7;
    while ( b!=0 )
    {
    t[i]=b%2;
    b=b/2;
    i=i-1;
    }
    }
    /////////////////////////////////////////////////////////////////////
    char convertion (int b)
    {
    char c;

    switch (b)
    {
    case 0:
    c ='A';
    break;
    case 1:
    c ='B';
    break;
    case 2:
    c ='C';
    break;
    case 3:
    c ='D';
    break;
    case 4:
    c ='E';
    break;
    case 5:
    c ='F';
    break;
    case 6:
    c ='G';
    break;
    case 7:
    c ='H';
    break;
    case 8:
    c ='I';
    break;
    case 9:
    c ='J';
    break;
    case 10:
    c ='K';
    break;
    case 11:
    c ='L';
    break;
    case 12:
    c ='M';
    break;
    case 13:
    c ='N';
    break;
    case 14:
    c ='O';
    break;
    case 15:
    c ='P';
    break;
    case 16:
    c ='Q';
    break;
    case 17:
    c ='R';
    break;
    case 18:
    c ='S';
    break;
    case 19:
    c ='T';
    break;
    case 20:
    c ='U';
    break;
    case 21:
    c ='V';
    break;
    case 22:
    c ='W';
    break;
    case 23:
    c ='X';
    break;
    case 24:
    c ='Y';
    break;
    case 25:
    c ='Z';
    break;
    case 26:
    c ='a';
    break;
    case 27:
    c ='b';
    break;
    case 28:
    c ='c';
    break;
    case 29:
    c ='d';
    break;
    case 30:
    c ='e';
    break;
    case 31:
    c ='f';
    break;
    case 32:
    c ='g';
    break;
    case 33:
    c ='h';
    break;
    case 34:
    c ='i';
    break;
    case 35:
    c ='j';
    break;
    case 36:
    c ='k';
    break;
    case 37:
    c ='l';
    break;
    case 38:
    c ='m';
    break;
    case 39:
    c ='n';
    break;
    case 40:
    c ='o';
    break;
    case 41:
    c ='p';
    break;
    case 42:
    c ='q';
    break;
    case 43:
    c ='r';
    break;
    case 44:
    c ='s';
    break;
    case 45:
    c ='t';
    break;
    case 46:
    c ='u';
    break;
    case 47:
    c ='v';
    break;
    case 48:
    c ='w';
    break;
    case 49:
    c ='x';
    break;
    case 50:
    c ='y';
    break;
    case 51:
    c ='z';
    break;
    case 52:
    c ='0';
    break;
    case 53:
    c ='1';
    break;
    case 54:
    c ='2';
    break;
    case 55:
    c ='3';
    break;
    case 56:
    c ='4';
    break;
    case 57:
    c ='5';
    break;
    case 58:
    c ='6';
    break;
    case 59:
    c ='7';
    break;
    case 60:
    c ='8';
    break;
    case 61:
    c ='9';
    break;
    case 62:
    c ='+';
    break;
    case 63:
    c ='/';
    break;
    case 64:
    c ='=';
    break;
    case 65:
    c ='=';
    break;
    }

    return c;
    }
    ////////////////////////////////////////////////////////
    void base64 (char nom[])
    {
    int i,j,k,som,puis,borne,elt;
    int ens8[500],vecval[100];

    vectnul (ens8,500);
    k=0;
    for (i=0;i<strlen(nom);i++)
    {
    convertascii ((int) nom[i]);//convertion de chaque caractere en code ascii
    for (j=0;j<8;j++)
    {
    ens8[k]=t[j];
    k=k+1;
    }
    }
    borne=k;
    vectnul (vecval,100);
    j=0;
    elt=0;
    while (j<borne)
    {
    som=0;
    puis=32;
    for (i=j;i<j+6;i++)
    {
    som = som + (ens8[i]*puis);
    puis = puis /2;
    }
    j=i;
    vecval[elt]=som;
    elt=elt+1;
    }
    videvect (vecbase,60);
    for (i=0;i<elt;i++)
    vecbase[i] = convertion(vecval[i]);

    }
    0