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

C Discussion :

La fonction select


Sujet :

C

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2012
    Messages : 25
    Points : 27
    Points
    27
    Par défaut La fonction select
    Bonjour,

    Comment utiliser select sous Windows ?

    Depuis maintenant 4 à 5 mois, je sais très bien utiliser select sous Linux. Cela m'a permis d'ailleurs de simuler des jeux tels que le typespeed ou encore le fastfood (une variante du snake que j'ai moi-même créé). Mais j'ai un petit soucis. J'essaye d'utiliser la fonction select sous Windows mais en vain. Quelqu'un saurait-il comment adapter select à la plateforme Windows ?

    J'aurais lu sur la toile quelques programmes qui utilisent <windows.h> mais le fait est que cela ne fonctionne pas : la fonction select n'est toujours pas reconnue (du moins à mon niveau). Espérant que quelqu'un puisse m'éclairer, je vous souhaite une bonne après-midi.

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    Points : 654
    Points
    654
    Par défaut
    Bonjour,

    select MSDN

    Une petite recherche dans google select C MSDN te permet de trouver cette page, toutes les infos sont la va voir à la fin "Requirements" et tu auras l'include et la dll nécessaire pour sont bon fonctionnement.

    PS : pense à mettre MSDN sur des recherches techniques pour windows ça aide

    Bonne fin de journée

  3. #3
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    Première chose, select n'est utilisable que pour des sockets sous windows, contrairement au select de linux.

    N'en déplaise à certain, le select de windows est un peu un "gros hack". Déjà, l’accès à une socket est en O(n^2) du nombre de sockets sur les quels tu fait ce select. Ensuite, comme les socket sont des nombre "un peu n'importe comment", l'élément a la position i n'a aucune raison d'être le file descriptor de valeur "i".

    Mes include, pour select (et les autres fonctions comme getaddrinfo) sous window sont :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #include <winsock2.h>
    #include <Ws2tcpip.h>
    #include <stdio.h>
    Avec ça, la fonction est bien déclarée.

    Pour l'utilisation, tu as cette page :
    http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

    Il faut bien garder en tête que la structure fd_set que tu manipule sous windows est celle ci.

    Aussi, pour récupérer les codes d’erreur (utile si tu fait des sockets non bloquantes) il faudra utiliser "WSAGetLastError".

    Je ne pense pas que taper directement dans le fd_set, pour avoir un algo en O(n) soit une mauvaise chose (et je ne me prive pas pour le faire).

    Attention, de base, seul 64 sockets peuvent être conservées dans un fd_set

    Si tu a d'autres questions, n'hésite pas.
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2012
    Messages : 25
    Points : 27
    Points
    27
    Par défaut
    @jouana
    Tiens, merci. J'avais déjà vu cette page mais je n'ai pris le soin de lire tout en entier car je pensais que seul le fonctionnement de select y est détaillé. J'ai maintenant lu la section Requirements et je comprends mieux. Ainsi, si j'ai bien compris, le code suivant (voir section EXEMPLE) devrait pouvoir fonctionner sous Windows si j'utilise les bon *.dll et autres) ? Parce que, ne codant que rarement sous Windows et préférant la ligne de commandes, j'ai souvent du mal quand je me connecte sous Windows.

  5. #5
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    Citation Envoyé par leMédaillon Voir le message
    @jouana
    Tiens, merci. J'avais déjà vu cette page mais je n'ai pris le soin de lire tout en entier car je pensais que seul le fonctionnement de select y est détaillé. J'ai maintenant lu la section Requirements et je comprends mieux. Ainsi, si j'ai bien compris, le code suivant (voir section EXEMPLE) devrait pouvoir fonctionner sous Windows si j'utilise les bon *.dll et autres) ? Parce que, ne codant que rarement sous Windows et préférant la ligne de commandes, j'ai souvent du mal quand je me connecte sous Windows.
    Non, stdin n'est pas une socket.

    Si tu remplace FD_SET(0, &rdfs) par FD_SET(une_socket, &rdfs), en lisant en diagonale, on dirait que oui.

    Mais je te déconseille fortement de te baser sur les pages de man linux/bsd pour utiliser select sous windows.
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2012
    Messages : 25
    Points : 27
    Points
    27
    Par défaut
    @Zenol
    Je te remercie pour toutes ces précisions. D'un auitre côté, j'ai quelques doutes. En réalité, si je m'orientes vers select sous Windows, c'est surtout pour récrire quelques programmes que j'avais écrit sous Linux et les adapter à Windows.

    Considérons le texte suivant. Il y a une partie de mon programme qui vérifie si le descripteur de flux STDIN_FILENO est disponible toute les 3 secondes. En réalité, un repas est affiché à l'écran. Puis le programme teste la disponibilité de STDIN_FILENO toutes les 3 secondes. Si le joueur arrive à prendre le repas avant la fin du compte à rebours, il gagne 10 points et un nouvel repas est affiché à un nouvel endroit. Sinon, s'il n'y arrive pas, il perd un point de vie (sur trois au total) puis un nouvel repas est affiché.

    Le problème ne réside ici pas dans la réalisation du compte à rebours ou du programme qui fonctionne bien sous Linux. Je rappelle que le programme est réalisé avec ncurses. Mais le problème ici est : comment simuler ce comportement de select (qui fonctionne sous Linux) sous Windows ? Faut-il utiliser select aussi ? Ou bien il y a une autre fonction adaptée à cela ?

    Espérant avoir été clair dans mes idées, je vous souhaite bonne après-midi.

  7. #7
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    En réalité, si je m'orientes vers select sous Windows, c'est surtout pour récrire quelques programmes que j'avais écrit sous Linux et les adapter à Windows.
    Bienvenue en enfer


    Je n'ai pas bien saisit ce que tu fait avec select. Tu utilise select(0, NULL, NULL, NULL, timeout) pour effectuer un compte a rebours bloquant de 3 secondes dans un thread?

    En tout cas, tu ne peux pas utiliser select pour avoir des informations sur l'entrée standard, ou même un fichier, car comme tu peux le lire sur la documentation, la structure fd_set ne peux contenir que des sockets.
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2012
    Messages : 25
    Points : 27
    Points
    27
    Par défaut
    Oui zenol ; je crois aussi que je suis à la porte de l'enfer là.

    Par contre,
    En tout cas, tu ne peux pas utiliser select pour avoir des informations sur l'entrée standard, ou même un fichier, car comme tu peux le lire sur la documentation, la structure fd_set ne peux contenir que des sockets.
    Je ne suis pas tout à fait du même avis que toi. select peut être utilisé pour tester la diponibilité d'un descriptueur de fichier et cela marche très bien sous Linux. Regardes un peu la portion de code suivante.

    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
    [...]
          find = FALSE ;
          FD_ZERO(&readfds) ;
          FD_SET(STDIN_FILENO, &readfds) ;
          timeout.tv_usec -= acc.tv_usec ;
          timeout.tv_sec -= acc.tv_sec ;
          if(timeout.tv_usec < 0) {
                timeout.tv_sec -= 1 ;
                timeout.tv_usec += 1000000 ;
          }
          if(gettimeofday(&tv1, NULL)==-1) {
             endcurses() ;
             perror("gettimeofday") ;
             return EXIT_FAILURE ;
          }
          if(select(1, &readfds, NULL, NULL, &timeout)==-1) {
             endcurses() ;
             perror("select") ;
             exit(EXIT_FAILURE) ;
          }
          if(FD_ISSET(STDIN_FILENO, &readfds)) {
             r = getch() ; // fontion getch() des ncurses et non celle de conio.h
             switch(r) {
                case ESCAPE:
                   cont = FALSE ;
                   break ;
                case KEY_UP:
                   if(lab->grid[posY-1][posX] == 1) { // player hits a wall
                      if(--pv==0)
    [...]
    Mais il faut noter que ce n'est pas select qui fait le compte à rebours : il y a tout un algorithme qui est derrière (mais rien de bien sorcier en tout cas).

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    @leMédaillon: La différence, c'est que sous *n*x, les sockets sont des descripteurs de fichier. Sous Windows, ce sont des HANDLEs spéciaux.

    Résultat, sous *n*x, select() marche aussi bien sur STDIN_FILENO que sur des sockets puisque c'est la même chose. Sous Windows, select() ne marche que sur des sockets, et pas sur des descripteurs de fichier, car sous Windows, ce sont des choses différentes.

    Le seul moyen d'attendre en même temps sur la console et un socket avec la même fonction, c'est:
    • passer la console en mode caractère par caractère, parce que sinon la fonction d'attente "mentira",
    • Utiliser WSAEventSelect() pour obtenir un Event lié à chaque socket,
    • Utiliser WaitForMultipleObjects() avec (Un WSAEVENT est, d'après je-ne-sais-plus-quel-écrit, utilisable comme un Event normal).

    Edit: Pour attendre seulement sur stdin, tu peux sauter la seconde étape et utiliser WaitForSingleObject() sur son handle au lieu de WaitForMultipleObjects().
    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
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2012
    Messages : 25
    Points : 27
    Points
    27
    Par défaut
    Je te remercie pour toutes ses précisions. Mais existerai-il un tutoriel qui explique tout cela de long en large ? Parce que mon code fonctionne bien sous Linux avec select. Je voudrais impérativement écrire une version adaptée pour Windows mais en vain.

  11. #11
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    La MSDN, avec toutes les fonctions que Médinoc t'a indiqué, devraient te permettre d'avoir PLEINS d'informations !
    Après, je pense qu'il doit y avoir des bouts de code en ligne qui utilisent toutes ces fonctions... n'hésite pas à taper leur nom dans google ! (j'ai trouvé quelques exemples forts utiles ainsi... mais ce fut long !)
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  12. #12
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Un truc en vrac:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    //Passer la console en caractère par caractère:
    HANDLE hCon = GetStdHandle(STD_INPUT_HANDLE);
    DWORD mode = 0;
    GetConsoleMode(hCon, &mode);
    mode &= ~ENABLE_LINE_INPUT;
    SetConsoleMode(hCon, mode);
     
    //Attendre qu'un truc se passe sur la console pdt trois secondes:
    WaitForSingleObject(hCon, 3000);
    Le problème si tu ne passes pas la console en mode caractère, c'est que WaitForSingleObject "ignore" le mode ligne: Ce qui veut dire que lui, il retournera dès le premier caractère tapé; puis ton getchar() ou fgets() bloquera jusqu'à ce que tu presses [Enter].

    Pour éviter ce problème, tu dois passer en mode caractère et bosser directement en getchar().
    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.

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2012
    Messages : 25
    Points : 27
    Points
    27
    Par défaut
    Humm I can see. Merci à vous, en particulier à Médinoc. Je vais me renseigner sur google, même si je pense qu'un lien vers un tutoriel existentiel, aurait été plus intéressant.

    Ah qu'est-ce-que c'est chia** de vouloir adapter des programmes pour qu'ils fonctionnent sous Windows et Linux en même temps. Merci et bonne soirée !

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

Discussions similaires

  1. contraire de la fonction select()
    Par danyboy85 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 26/04/2006, 16h39
  2. [fonction] select
    Par heid dans le forum Oracle
    Réponses: 11
    Dernier message: 01/03/2006, 14h26
  3. Infos sur la fonction select en C
    Par oook dans le forum C
    Réponses: 8
    Dernier message: 07/12/2005, 15h15
  4. la fonction select
    Par flo456 dans le forum ASP
    Réponses: 3
    Dernier message: 21/11/2005, 11h27
  5. la fonction select()
    Par youp_db dans le forum Windows
    Réponses: 1
    Dernier message: 02/09/2005, 16h03

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