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 :

Invité de commande avec fgets


Sujet :

Réseau C

  1. #1
    Membre éprouvé
    Avatar de Freed0
    Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    635
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 635
    Points : 953
    Points
    953
    Par défaut Invité de commande avec fgets
    Bonjour à tous,

    Voilà j'ai décidé d'occuper mon après-midi en réalisant un programme ayant environ les mêmes fonctions que le célèbre client ftp (en ligne de commande ).

    Mon premier but étant de réaliser un petit menu, j'envisageais une boucle dans laquelle on demande à l'utilisateur d'entrer une commande, ceci se répétant tant que la commande n'est pas bonne.

    Quelque chose comme ça en somme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    FAIRE {
        Saisie de la commande
        Verification de la saisie (nettoyage)
    } TANT QUE saisie ne vaut rien (<enter>)
     
    switch(saisie)
    {
        ... etc ...
    J'en venais donc à ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    char commd[10];
    int size = 0;
     
    do {
        fgets(commd, sizeof(commd), stdin);
        size = sizeof(commd);
        if(size > 0)
            commd[size] = 0;
    } while (commd == NULL);
     
    switch(commd) {
        ...
    J'aimerais donc un petit coup de main pour le nettoyage de la saisie, même si je pense que cela a déjà été demandé pas mal de fois, et aussi la valeur que je pourrais mettre entre les paranthèses du while, car j'imagine que ma chaine ne vaudra pas NULL si j'appuie sur enter .

    Merci beaucoup

  2. #2
    Membre éclairé
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Points : 750
    Points
    750
    Par défaut
    Plusieurs erreurs déjà:
    - sizeof(comm) te rendra toujours 10 (c'est un tableau donc sizeof te renvoie sa taille): http://c.developpez.com/faq/c/?page=...ABLEAUX_sizeof
    - fgets mets déjà le \0 a la fin de la chaine.

    Après pour le test du while, effectivement commd==NULL sera toujours faux (commd te donne l'adresse de ton tableau!). Tu peux soit utiliser strlen (longueur de la chaine different de zero) ou la comparaison a une chaine vide mais regarde là aussi : http://c.developpez.com/faq/c/?page=...hr_after_fgets

    Enfin le switch ne marchera pas pour des chaines de caractère, il te faudra utiliser strcmp ou strcasecmp.

    Et la FAQ est ton amie : http://c.developpez.com/faq/c/

  3. #3
    Membre éprouvé
    Avatar de Freed0
    Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    635
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 635
    Points : 953
    Points
    953
    Par défaut
    Merci pour ta réponse.

    J'ai modifié mon code :

    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
    char commd[10];
     
    do {
        if(fgets(commd, sizeof(commd), stdin) != NULL)
        {
            char *p = strchr(commd, '\n');
            if(p)
            {
                *p = 0;
            }
        }
    } while(strlen(commd) == 0);
     
    if(!strcmp(commd, "exit"))
        puts("OK !");
     
    return 0;
    Pour le moment ça fonctionne... Faudra juste faire plusieurs strcmp

    On va dire que le problème est résolu, mais toutes vos remarques/suggestions sont les bienvenues !

    Je laisse le topic comme ça au cas j'aurais d'autres questions

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Freed0
    Mon premier but étant de réaliser un petit menu,
    Tu devrais commencer par étudier fgets() de plus près.

    Ensuite, ce que tu veux faire n'est pas du tout un 'menu', mais un 'shell' (interpréteur de commandes) :
    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
     
    #include <stdio.h>
    #include <string.h>
     
    static void clean (char *s, FILE *fp)
    {
       /* search ... */
       char *p = strchr (s, '\n'); /* <string.h> */
       if (p != NULL)
       {
          /* ... and kill */
          *p = 0;
       }
       else
       {
          /* purge */
          int c;
          while ((c = fgetc(fp)) != '\n' && c != EOF)
          {
          }
       }
    }
     
    int main()
    {
       int end = 0;
       do
       {
          char cde[128];
          printf ("> ");
          fflush (stdout);
          fgets(cde, sizeof cde, stdin);
          clean(cde, stdin);
     
          /* analyser la commande et la traiter
             (c'est pas avec un 'switch' que tu vas t'en sortir)
             */
          if (strcmp(cde, "help") == 0)
          {
             printf ("\nhelp quit\n\n");
          }
          else if (strcmp(cde, "quit") == 0)
          {
             printf ("\nbye\n\n");
             end = 1;
          }
          else
          {
             printf("\nunknown command\n\n");
          }
       }
       while (!end);
     
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    > dsfgdfsg
     
    unknown command
     
    > help
     
    help quit
     
    > quit
     
    bye
    Des réponses à tes questions ici :

    http://emmanuel-delahaye.developpez....tes.htm#saisie
    http://emmanuel-delahaye.developpez....s.htm#fichiers
    http://emmanuel-delahaye.developpez....tes.htm#fflush
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Membre éprouvé
    Avatar de Freed0
    Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    635
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 635
    Points : 953
    Points
    953
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Tu devrais commencer par étudier fgets() de plus près.

    Ensuite, ce que tu veux faire n'est pas du tout un 'menu', mais un 'shell' (interpréteur de commandes) :
    Des réponses à tes questions ici :

    http://emmanuel-delahaye.developpez....tes.htm#saisie
    http://emmanuel-delahaye.developpez....s.htm#fichiers
    http://emmanuel-delahaye.developpez....tes.htm#fflush
    Merci pour ta réponse, je vais regarder ça de plus près.

  6. #6
    Membre éprouvé
    Avatar de Freed0
    Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    635
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 635
    Points : 953
    Points
    953
    Par défaut
    J'ai maintenant un problème avec la connexion au serveur ftp...

    Je pensais qu'il suffirait simplement de me connecter via le port 21, mais apparament non.

    J'ai donc une fonction netw_connect(char *ip) qui se connecte à l'ip voulue.
    Lorsque mon programme se lance, j'entre l'ip puis je crée le socket etc...

    Voici quelques extraits de mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    char ip[20];
    int ret_err = 0;
     
    printf("Vers ");
    fgets(ip, sizeof(ip), stdin);
    clean(ip, stdin);
     
    ret_err = netw_connect(ip);
     
    return ret_err;
    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
    int netw_connect(char *ip)
    {
        int ret_err = 0, sock_err = 0;
        SOCKET sock;
        SOCKADDR_IN sin = {0};
     
        sock = socket(PF_INET, SOCK_STREAM, 0);
     
        if(sock != INVALID_SOCKET)
        {
            printf("Socket %d ouvert.\n", sock);
     
            sin.sin_family = AF_INET;
            sin.sin_addr.s_addr = inet_addr(ip);
            sin.sin_port = htons(20);
     
            sock_err = connect(sock, (SOCKADDR *)&sin, sizeof(sin));
     
            if(sock_err != SOCKET_ERROR)
            {
                printf("Connecté à %s.", inet_ntoa(sin.sin_addr));
            }
            else
            {
                printf("Hote inconnu %s.", inet_ntoa(sin.sin_addr));
                ret_err = 1;
            }
        }
        else
        {
            perror("Socket.open");
            ret_err = 1;
        }
     
        return ret_err;
    }
    Et j'obtiens ce résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ftp> open
    Vers 193.74.22.160
    Socket.open : No error
    ftp> _
    Une idée ?

    Edit : J'avais oublié le WSAStartup(), honte à moi

Discussions similaires

  1. Lancer l'invite de commande avec une macro
    Par FlorianBreizh dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 12/06/2009, 17h21
  2. [WINDEV] invite de commande avec windev
    Par benja01 dans le forum WinDev
    Réponses: 4
    Dernier message: 03/04/2008, 11h10
  3. Réponses: 7
    Dernier message: 18/01/2007, 12h13
  4. se déplacer avec l'invite de commandes (windows xp)
    Par kriskikout dans le forum Langage
    Réponses: 9
    Dernier message: 05/05/2006, 15h59
  5. compilation avec invite de commandes
    Par new_wave dans le forum Général Java
    Réponses: 1
    Dernier message: 21/07/2005, 22h32

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