IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau C Discussion :

connexion IMAP en C


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de yakamoneye
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 108
    Par défaut connexion IMAP en C
    bonjour à tous, une fois encore j'en appelle à votre savoir,
    (mon ami Google ne sait pas, la RFC n'est pas super claire et malheureusement le man non plus).

    Voila mon probleme, je souhaiterai me connecter sur un serveur via le protocole IMAP...(en C grace aux sockets).
    Les gethostbyname(), socket(), connect(), send() et recv() fonctionnent.
    Le petit souci que je rencontre c'est que je ne sais pas comment formater ma requete:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a1 login 'user' 'password'
    pour que le serveur l'interprete correctement.
    Pour l'instant celui-ci me repond toujours la même chose, que l'identifiant et le mot de passe soient corrects ou pas !
    Je me permets de joindre mon code(il sera certainement plus parlant):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
     
     
    #include "portablesocket.h"
     
    #define PORT 143
     
    int main (int  argv, char* argc[]){
     
    	if (argv < 2)
    	{
    	fprintf(stderr,"\n\t\aERROR use as %s 'serverhost'\n",argc[0]);
    	exit(EXIT_FAILURE);
    	}
     
     SOCKADDR_IN SERVER;
     struct hostent* IP;
     SOCKET sock;
     int retour;
     char Buffer[128]="a1 login identifiant password";
     char Buffer2[128]="a2 select inbox";
     
     	if ((IP = gethostbyname(argc[1])) == NULL)
     	{
     	printf("gethostbyname() failed\n");
     	exit(EXIT_FAILURE);
     	} 
     
     
     
     
     
     SERVER.sin_family = AF_INET;
     SERVER.sin_addr = *((struct in_addr *)IP->h_addr);
     SERVER.sin_port = htons(PORT);
     
     printf("tentative de connexion IMAP sur %s : %d ...\n", IP->h_name, PORT);
     sock=socket(AF_INET, SOCK_STREAM, 0);
     
    	if (sock == INVALID_SOCKET) 
    	{
    	printf("socket() failed\n");
    	exit(EXIT_FAILURE);
    	}
     
    	if (connect(sock, (SOCKADDR*)&SERVER, sizeof(SOCKADDR) ) == SOCKET_ERROR)
    	{
    	printf("connect() failed\n");
    	exit(EXIT_FAILURE);
    	}
     
     printf("connexion IMAP etablie sur %s : %d !\n", IP->h_name, PORT);
     
     retour = send(sock,Buffer,sizeof(Buffer),0 );
     	if (retour == SOCKET_ERROR)
    	{
    	printf("send() failed\n");
    	}
     printf("paquet %s envoye\n",Buffer);
     
     retour = recv(sock,Buffer,sizeof(Buffer),0 );
    	if (retour == SOCKET_ERROR)
    	{
    	printf("recv() failed\n");
    	}
     printf("reponse : %s\n",Buffer);
     
     
     
     retour = send(sock,Buffer2,sizeof(Buffer2),0 );
     	if (retour == SOCKET_ERROR)
    	{
    	printf("send() failed\n");
    	}
     printf("paquet %s envoye\n",Buffer2);
     
     retour = recv(sock,Buffer2,sizeof(Buffer2),0 );
    	if (retour == SOCKET_ERROR)
    	{
    	printf("recv() failed\n");
    	}
     printf("reponse : %s\n",Buffer2);
     
     return(EXIT_SUCCESS);
    }
    Merci par avance a tout ceux qui pourrait m'apporter une solution.

  2. #2
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par yakamoneye Voir le message
    Merci par avance a tout ceux qui pourrait m'apporter une solution.
    Le problème est malheureusement récurrent. Une mauvaise gestion des fonctions d'émission et de réception de données...

    http://emmanuel-delahaye.developpez....eaux.htm#texte

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
     
    #include <stdio.h>
    #include <stdlib.h>
     
    #include "psock/inc/psock.h"
     
    #define PORT 143
     
    void envoyer (SOCKET sock, char const *s)
    {
       int retour = send (sock, s, strlen (s), 0);
       if (retour == SOCKET_ERROR)
       {
          printf ("send() failed\n");
       }
       else
       {
          printf ("paquet '%s' envoye\n", s);
       }
    }
     
    void recevoir (SOCKET sock)
    {
       char buffer[128];
       int retour = recv (sock, buffer, sizeof buffer - 1, 0);
       if (retour == SOCKET_ERROR)
       {
          printf ("recv() failed\n");
       }
       else
       {
          buffer[retour] = 0;
          printf ("reponse : '%s'\n", buffer);
       }
    }
     
    int main (int argv, char *argc[])
    {
       int ret = EXIT_SUCCESS;
       if (argv >= 2)
       {
          struct hostent *IP;
    #if defined (WIN32)
          {
             WSADATA wsa_data;
             WSAStartup (MAKEWORD (2, 2), &wsa_data);
          }
    #endif
          IP = gethostbyname (argc[1]);
          if (IP != NULL)
          {
             printf ("tentative de connexion IMAP sur %s : %d ...\n", IP->h_name,
                     PORT);
             {
                SOCKET sock = socket (AF_INET, SOCK_STREAM, 0);
     
                if (sock != INVALID_SOCKET)
                {
                   SOCKADDR_IN SERVER;
     
                   SERVER.sin_family = AF_INET;
                   SERVER.sin_addr = *((struct in_addr *) IP->h_addr);
                   SERVER.sin_port = htons (PORT);
     
                   if (connect (sock, (SOCKADDR *) & SERVER, sizeof (SOCKADDR)) !=
                       SOCKET_ERROR)
                   {
     
                      printf ("connexion IMAP etablie sur %s : %d !\n",
                              IP->h_name, PORT);
     
                      /* dialogue */
                      {
                         envoyer (sock, "a1 login identifiant password");
                         recevoir (sock);
     
                         envoyer (sock, "a2 select inbox");
                         recevoir (sock);
                      }
                   }
                   else
                   {
                      printf ("connect() failed\n");
                      ret = EXIT_FAILURE;
                   }
                }
                else
                {
                   printf ("socket() failed\n");
                   ret = EXIT_FAILURE;
                }
             }
          }
          else
          {
             printf ("gethostbyname() failed\n");
             ret = EXIT_FAILURE;
          }
    #if defined (WIN32)
          WSACleanup ();
    #endif
       }
       else
       {
          fprintf (stderr, "\n\t\aERROR use as %s 'serverhost'\n", argc[0]);
          ret = EXIT_FAILURE;
       }
       return ret;
    }

    Il faut apprendre à travailler en couches...

    http://delahaye.emmanuel.free.fr/clib/psock/

  3. #3
    Membre éprouvé Avatar de yakamoneye
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 108
    Par défaut
    Merci de m'avoir repondu mais là je dois avouer que cela n'est pas tout à fait clair.
    en fait, lors du premier echange le serveur se moque totalement de ce que je lui envoie il me repond tout simplement qu'il est pret (ou pas ...) ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    reponse : * OK mwinf2j01 IMAP4 server ready
    et ensuite lors du deuxieme echange il faut a cet instant lui transmettre un TAG suivit du mot-clé LOGIN de 'identifiant' et 'password'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    a1 LOGIN mon_identifiant mon_mot_de_passe
    mais pour que le serveur puisse l'interpreter il faut la formater en lui specifiant certains 'atoms' , n'est ce pas ?

    extrait de la RFC 2060 sur protocole IMAP4rev1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    4.3.    String
     
       A string is in one of two forms: literal and quoted string.  The
       literal form is the general form of string.  The quoted string form
       is an alternative that avoids the overhead of processing a literal at
       the cost of limitations of characters that can be used in a quoted
       string.
     
       A literal is a sequence of zero or more octets (including CR and LF),
       prefix-quoted with an octet count in the form of an open brace ("{"),
       the number of octets, close brace ("}"), and CRLF.  In the case of
       literals transmitted from server to client, the CRLF is immediately
       followed by the octet data.  In the case of literals transmitted from
       client to server, the client MUST wait to receive a command
       continuation request (described later in this document) before
       sending the octet data (and the remainder of the command).
     
       A quoted string is a sequence of zero or more 7-bit characters,
       excluding CR and LF, with double quote (<">) characters at each end.
     
       The empty string is represented as either "" (a quoted string with
       zero characters between double quotes) or as {0} followed by CRLF (a
       literal with an octet count of 0).
     
          Note: Even if the octet count is 0, a client transmitting a
          literal MUST wait to receive a command continuation request.
     
    4.3.1.  8-bit and Binary Strings
     
       8-bit textual and binary mail is supported through the use of a
       [MIME-IMB] content transfer encoding.  IMAP4rev1 implementations MAY
       transmit 8-bit or multi-octet characters in literals, but SHOULD do
       so only when the [CHARSET] is identified.
     
       Although a BINARY body encoding is defined, unencoded binary strings
       are not permitted.  A "binary string" is any string with NUL
       characters.  Implementations MUST encode binary data into a textual
       form such as BASE64 before transmitting the data.  A string with an
       excessive amount of CTL characters MAY also be considered to be
       binary.
    Est-ce que c'est bien ça, est ce qu'il suffit de formater la chaine de characteres de la fonction send() pour que le serveur puisse l'interpreter ?
    Si oui, existerai-til un exemple qui montre comment utiluser les 'ATOMS' ( {, }, SP, CR, LF ) ?
    Par avance merci beaucoup a tout ceux qui seraient succeptibles de m'apporter une information.

  4. #4
    Invité de passage
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 1
    Par défaut Même problème.
    Je rencontre le même problème. J'ai un problème au niveau de la reception de la réponse du serveur distant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // *******************************************************************************************
    // Reception des données
    // *******************************************************************************************
    nombre_de_caractere=recv(id_de_la_nouvelle_socket,buffer,1515,0);
    if (nombre_de_caractere==SOCKET_ERROR)
          printf("\nDesole, je n'ai pas recu de donnee");
    else
         {
          buffer[nombre_de_caractere]=0; // Permet de fermer le tableau après le contenu des data, car la fonction recv ne le fait pas
          printf("\nVoici les donnees : %s",buffer);
          }
     
    *******************************************************************************************
    Merci d'avance pour votre aide.

  5. #5
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Lalooze Voir le message
    Je rencontre le même problème.
    C'est pas une raison pour squatter une discussion. La règle est simple : Une discussion par question.

    Tu dois donc ouvrir une nouvelle discussion.

    De plus, il faut poster tout ton code, sinon, on ne sait pas ce que tu as oublié et on ne peut rien corriger.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Connexion imap impossible d'ouvrir le flux
    Par lecra dans le forum Langage
    Réponses: 0
    Dernier message: 26/11/2013, 09h38
  2. Réponses: 1
    Dernier message: 14/10/2010, 07h50
  3. [IMAP] Fin prématurée de la connexion
    Par taffMan dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 21/02/2008, 16h15
  4. [Cyrus] Connexion au serveur imap impossible
    Par Zelltemplar dans le forum Administration système
    Réponses: 3
    Dernier message: 19/04/2007, 14h13
  5. Réponses: 2
    Dernier message: 27/09/2006, 18h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo