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

Windows Discussion :

Utiliser FD_SET sous Windows sur l'entré STDIN ?


Sujet :

Windows

  1. #1
    Membre régulier
    Inscrit en
    Septembre 2003
    Messages
    222
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 222
    Points : 91
    Points
    91
    Par défaut Utiliser FD_SET sous Windows sur l'entré STDIN ?
    Bonjour,
    Je pense que mon titre est clair mais je vais quand même préciser quelques détails...
    Je développe donc une petite application serveur et je veux pouvoir taper des commandes. J'aimerai ne pas à avoir utiliser plusieurs threads.
    Mon code doit être le plus portable possible. (Pas de fork, ou execve sous Windows)

    Je suis confronté au problème suivant:
    Je sais qu'il est possible de faire FD_SET(0, &readfd) sous Linux pour que le select prenne en compte les entrées stdin
    Mais par contre sous windows ca ne marche pas du faite que le FD_SET prends uniquement en compte des SOCKETs et que STDIN est un FILE*, je crois.

    Quelqu'un connait il un moyen...
    Merci d'avance.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Normalement, sous Unixoïde, les sockets sont des descripteurs de fichiers, donc on peut ajouter à un fd_set le descripteur 0, qui correspond à l'entrée standard.

    Malheureusement, sous Windows, les sockets ne sont pas des descripteurs mais des HANDLEs: Utiliser un descripteur ne marchera pas, il faut donc passer le HANDLE de l'entrée standard sous Windows. (Il s'obtient en faisant GetStdHandle(STD_INPUT_HANDLE). Je n'ai pas testé cela, mais il est possible qu'en castant le handle retourné en SOCKET pour l'ajouter au fd_set, ça marche.)

    Bref, tu vas quand même avoir besoin de quelques #ifdef dans ton code...

  3. #3
    Membre régulier
    Inscrit en
    Septembre 2003
    Messages
    222
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 222
    Points : 91
    Points
    91
    Par défaut
    ok merci, j'essaye de suite...

  4. #4
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 683
    Points
    10 683
    Billets dans le blog
    3
    Par défaut
    L'approche Windows serait d'associer un event à ta socket via WSAEventSelect, et de faire un WaitForMultipleObjects sur tes socket et STD_INPUT_HANDLE.
    Mais l'attente dur la console est un peu particulière, je ne crois pas qu'on puisse filtrer certains évènements tel que FOCUS_EVENT malgré un SetConsoleMode( 0 ). Voir la doc de ReadConsoleInput.

  5. #5
    Membre régulier
    Inscrit en
    Septembre 2003
    Messages
    222
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 222
    Points : 91
    Points
    91
    Par défaut
    Bon et bien la méthode ne marche pas...
    Quant à ce que tu proposes, je penses que le plus simple et surtout le plus rapide à mettre en place est l'utilisation d'un thread via createThread sous Windows et un execv sous Linux
    Merci pour les infos

    Le problème du fd_set sur stdin sous Windows reste d'actualité

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Je me souviens avoir essayé un WaitForSingleObject() normal sur une console, mais je la lisais avec les fonctions standard au lieu de ReadConsoleInput(), si bien que le wait me disait qu'il y avait des données, et j'aterrissait sur la fonciton de lecture bloquante...

    Finalement, je suis moi aussi passé par un thread, mais pas n'importe comment:
    - Dans le thread principal, je duplique le handle de la console, et je lis dessus avec ReadFile() ou ReadConsole().
    - Dans un thread secondaire, je ferme le handle dupliqué après un timeout: La fonction de lecture échoue alors avec ERROR_INVALID_HANDLE. Ça marche sous 2000 et XP, mais j'ei bien peur que ce comportement soit indéfini sur d'autres versions...

  7. #7
    Membre régulier
    Inscrit en
    Septembre 2003
    Messages
    222
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 222
    Points : 91
    Points
    91
    Par défaut
    les threads c'est le plus simple...

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

Discussions similaires

  1. C/C++ : utiliser argv sous windows ?
    Par dmichel dans le forum Windows
    Réponses: 4
    Dernier message: 01/03/2007, 13h57
  2. Utiliser crypt() sous windows
    Par Samyhijodelaluna dans le forum C
    Réponses: 2
    Dernier message: 30/12/2006, 15h58
  3. Utiliser FPING sous WINDOWS
    Par TigreRouge dans le forum Programmation et administration système
    Réponses: 7
    Dernier message: 28/04/2006, 10h03

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