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 :

comment définir fread si on ne connait pas la longuer à lire


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Par défaut comment définir fread si on ne connait pas la longuer à lire
    Bonjour,

    J'ai un programme qui boucle indéfiniment ( while(1) ).

    Je souhaite qu' il continue d' effectuer les tâches dans la boucle, mais aussi qu'il soit capable de recevoir des commandes en entrée std.

    Il s'agit d'un serveur, puisque j'ai déjà un select dans mon programme, je pensais lire de l'entrée std avec fread et ajouter la taille dans le fd_set qui est utilisé dans mon select.

    Mon problème est que la fonction fread(&tmp,1,size_t nombre caractères ,stdin) a besoin du nombres de caractères à lire et que je ne sais pas à l'avance combien il y en a.

    Si vous avez une autre méthode à proposer ....


    Merci à l'avance,

    Jerome

  2. #2
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    je ne sais pas à l'avance combien il y en a.
    Ca ne devrait pas poser de problème du moment que le buffer de réception est assez grand.

  3. #3
    Membre éclairé Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Par défaut
    Mais si par exemple j'écris

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    fread(chaine,1,10,stdin)
    il ne va rien me donner tant qu'il n'a pas reçu 10 caractères.

  4. #4
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Salut,

    Ton probleme c'est que tu veux pouvoir lire des trucs sur l'entrée standard mais que si ya rien, bein le programme doit continuer, c'est ça?
    Dans ce cas, t'es obligé de passer par des threads ou un fork
    Un process ou thread fera le traitement de fond et l'autre accepetera les commandes en entrée standard (et utilise fgets à la place de fread)

  5. #5
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Pourquoi ne rajoute tu pas stdin à ton select?
    Le descripteur de stdin est 0.

    Par contre cela ne fonctionne pas sous Windows (va savoir pourquoi).

  6. #6
    Membre éclairé Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Par défaut
    puisque j'ai déjà le select, pourquoi ajouter un fork ou encore un thread ??

    comment passer stdin à select ?

    je ne peux faire FD_SET(stdin,&master).


    Merci pour votre aide

  7. #7
    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 je®ome
    je ne peux faire FD_SET(stdin,&master).
    Pourquoi pas ?

  8. #8
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Scuzez, je connaissais pas select()

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par Skyrunner
    Par contre cela ne fonctionne pas sous Windows (va savoir pourquoi).
    ça ne marche pas sous Windows parce que sous Windows, un socket n'est pas un descripteur mais un HANDLE.


    Emmanuel: Tu perds la main, stdin est un FILE *, pas un descripteur.
    Par contre, en n'étant pas sous Windows, FD_SET(STDIN_FILENO, &master) devrait marcher...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Membre éclairé Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Par défaut
    Mais je ne vois pas comment gerer STDIN_FILENO en l'ajoutant tel quel à fd_set.

    qn sait-il où je peux trouver un exemple ?

    Mais pour fread, n'y a-t-il pas un moyen de résoudre le problème ?

    pour pouvoir lire moins que le nombre indiqué ds fread, faut sortir avec <ctrl>+d ,
    enfin, je ne vois pas d'autre moyen et ceci n'est pas vraiment pratique.

    Merci de votre aide

  11. #11
    Membre éprouvé
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Par défaut
    un exemple dans le man (man select)
    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
            #include <stdio.h>
           #include <sys/time.h>
           #include <sys/types.h>
           #include <unistd.h>
     
           int
           main(void) {
               fd_set rfds;
               struct timeval tv;
               int retval;
     
               /* Watch stdin (fd 0) to see when it has input. */
               FD_ZERO(&rfds);
               FD_SET(0, &rfds);
               /* Wait up to five seconds. */
               tv.tv_sec = 5;
               tv.tv_usec = 0;
     
               retval = select(1, &rfds, NULL, NULL, &tv);
               /* Don't rely on the value of tv now! */
     
               if (retval == -1)
                   perror("select()");
               else if (retval)
                   printf("Data is available now.\n");
                   /* FD_ISSET(0, &rfds) will be true. */
               else
                   printf("No data within five seconds.\n");
     
               return 0;
           }
    un autre code qui fait plus ou moins la meme chose: http://beej.us/guide/bgnet/examples/select.c
    en remplaçant les 0 par STDIN_FILENO, c'est au poil

  12. #12
    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 je®ome
    J'ai un programme qui boucle indéfiniment ( while(1) ).

    Je souhaite qu' il continue d' effectuer les tâches dans la boucle, mais aussi qu'il soit capable de recevoir des commandes en entrée std.

    Il s'agit d'un serveur, puisque j'ai déjà un select dans mon programme, je pensais lire de l'entrée std avec fread et ajouter la taille dans le fd_set qui est utilisé dans mon select.

    Mon problème est que la fonction fread(&tmp,1,size_t nombre caractères ,stdin) a besoin du nombres de caractères à lire et que je ne sais pas à l'avance combien il y en a.
    Il faut relire la définition de fread() et le rôle des paramètres... Il ya un parametre 'taille d'un bloc' en bytes et un parametre 'nombre de blocks'.

    Le nombre de blocs que l'on passe à fread() est le nombre maximum de blocs que l'on veut lire en une fois, de façon à ne pas saturer le tableau de char. Le nombre de blocs réellement lu est retourné par la fonction.

    fread() est blocant et se débloque dès qu'au moins un bloc est prêt. Tant qu'il y a des blocs à lire, fread() n'est pas blocant... La boucle fait donc son travail de lecture toute seule...

    http://dpobel.free.fr/man/html/affic...049/man/fread/

  13. #13
    Membre éclairé Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Par défaut
    Il me semble que ne comprend pas vraiment le fonctionnement de fread.

    Si je fais par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int rval;
    char *chaine;
     
    if((rval=fread(chaine,sizeof(char),10,stdin))>0)
    {
                   printf("%s\n",chaine);
    }
    la chaine ne sera imprimé qu'après avoir entré 10 caractères.

    je ne comprends pas ce que tu veux dire emmanuel.

    et pour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    FD_SET(stdin,&master);
    je reçois l'erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    serveur.c:65: error: invalid operands to binary /
    serveur.c:65: error: invalid lvalue in asm output 0

  14. #14
    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 je®ome
    Il me semble que ne comprend pas vraiment le fonctionnement de fread.

    Si je fais par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int rval;
    char *chaine;
     
    if((rval=fread(chaine,sizeof(char),10,stdin))>0)
    {
                   printf("%s\n",chaine);
    }
    la chaine ne sera imprimé qu'après avoir entré 10 caractères.
    Avec stdin, oui. mais avec un fichier, non.
    et pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    FD_SET(stdin,&master);
    je reçois l'erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    serveur.c:65: error: invalid operands to binary /
    serveur.c:65: error: invalid lvalue in asm output 0
    Oui, parce que ce n'est pas stdin qu'il faut mettre, mais son numéro de fichier qui est FILENO_STDIN. Il faut lire les docs...

  15. #15
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Et ensuite lorsque tu tapes quelque chose au clavier et que tu appui sur Entrée, le select se declenche et tu fais ce que tu as à faire.

  16. #16
    Membre éclairé Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Par défaut
    merci, là maintenant ça marche.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 16/08/2014, 15h20
  2. Réponses: 2
    Dernier message: 31/03/2010, 13h31
  3. Réponses: 6
    Dernier message: 20/12/2007, 15h04
  4. Réponses: 4
    Dernier message: 08/05/2006, 16h41
  5. Comment définir le type matrice ?
    Par charly dans le forum Langage
    Réponses: 7
    Dernier message: 15/06/2002, 21h01

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