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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    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
    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 très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    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 averti
    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
    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.

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    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.

  5. #5
    Membre averti
    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
    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.

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    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.

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    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.

+ 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