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 remplacer STDIN_FILENO sous windows ?


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de jbarreau-mainson
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    446
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 446
    Par défaut Comment remplacer STDIN_FILENO sous windows ?
    Bonjour à tous,

    Ma question est dans le titre, comment puis-je remplacer STDIN_FILENO sous windows ?

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    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 397
    Par défaut
    Pour ça, le plus simple est de le définir toi-même:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #ifdef _WIN32
    #ifndef STDIN_FILENO
    #define STDIN_FILENO 0
    #define STDOUT_FILENO 1
    #define STDERR_FILENO 2
    #endif
    #endif
    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.

  3. #3
    Membre chevronné Avatar de jbarreau-mainson
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    446
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 446
    Par défaut
    Ok je vais tenter ça, mon but est en fait de rendre mes sockets non bloquants, j'ai vu qu'il y avait aussi la fonction WSAAsyncselect si j'ai bonne mémoire, il ne me reste plus qu'à trouver une doc !

    merci.

  4. #4
    Membre chevronné Avatar de jbarreau-mainson
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    446
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 446
    Par défaut
    Qu'est-ce qui ne va pas avec le mode par défaut ?
    Je souhaite réaliser un serveur multi clients et je coince un peu ...

    Et je ne veux pas utiliser de threads.

    Je bloque un peu sur l'algo de mon problème du coup car il faut que mon serveur ecoute, tout en gerant les clients déjà connectés.

  5. #5
    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 jbarreau-mainson Voir le message
    Je souhaite réaliser un serveur multi clients et je coince un peu ...

    Et je ne veux pas utiliser de threads.
    Ah ? Pourquoi ?
    Je bloque un peu sur l'algo de mon problème du coup car il faut que mon serveur ecoute, tout en gerant les clients déjà connectés.
    Processus ou threads. Pas trop le choix. La solution avec select() risque d'être très complexe...

    Quoiqu'il en soit, il n'y a pas du tout besoin de passer en asynchrone...

  6. #6
    Membre chevronné Avatar de jbarreau-mainson
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    446
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 446
    Par défaut
    Ah ? Pourquoi ?
    On me l'impose, et puis si deux threads attaquent la pile en meme temps c'est la pagaille.

    Bref mon problème reste l'algorithme ...

  7. #7
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Citation Envoyé par jbarreau-mainson Voir le message
    Ok je vais tenter ça, mon but est en fait de rendre mes sockets non bloquants, j'ai vu qu'il y avait aussi la fonction WSAAsyncselect si j'ai bonne mémoire, il ne me reste plus qu'à trouver une doc !

    merci.
    Il y a un tutoriel sur l'utilisation des sockets non bloquants ici. L'utilisation de WSAAsyncSelect permet d'avoir un programme bien structuré (sans boucle, sans multi-threading, etc.) mais pour l'utiliser, il faut avoir créé une fenêtre (pas forcément visible ...), donc elle ne peut être proprement utilisée dans une application console à moins d'avoir deux threads : le thread principal et un autre thread pour contenir la fenêtre.

  8. #8
    Membre chevronné Avatar de jbarreau-mainson
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    446
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 446
    Par défaut
    Merci a tous pour ces explications, je regarde ça apres manger

    Non, il donnera un truc de ce genre-ci:


    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
    SOCKET server = socket();
    listen(server);
    LISTEDECLIENTS clients;
    for(;;)
    {
    	fd_set readfds;
    	FD_SET(server);
    	for all clients
    		FD_SET(clients[i]);
    	select(..., readfds, ...);
    	if(FD_ISSET(server))
    		accept(...)
    	for all clients
    		if(FD_ISSET(clients[i])
    			recv(clients[i]);
    }
    Dans ce cas présent, tous les sockets clients ont été au préalable déclarés et initialisés pour un nombre de clients definit n'est ce pas ?

  9. #9
    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 jbarreau-mainson Voir le message
    Dans ce cas présent, tous les sockets clients ont été au préalable déclarés
    tableau : oui
    liste chainée : non
    et initialisés pour un nombre de clients definit n'est ce pas ?
    initialisé, non. (enfin à INVALID_SOCKET, oui).

    Le nombre de clients peut être variable. Il suffit d'une structure de données souple (tableau dynamique, liste chainée ...)
    ceci dit, on ne va peut être pas non plus accepter 500.000 clients en meme temps. Pour une machine donnée, il semnble que 1000 à 10000 soit le maximum (ajuster listen() en conséquence... 100, par exemple. Bien lire la doc...)...

    Il ne faut pas oublier les temps de traitement et de réponses... Si c'est du html, en gros, on émet 100 à 1000 caractères pour un reçu...

  10. #10
    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 jbarreau-mainson Voir le message
    Bonjour à tous,

    Ma question est dans le titre, comment puis-je remplacer STDIN_FILENO sous windows ?
    Si c'est pour utiliser avec select(), laisse tomber. Ca ne fonctionnera pas. De toutes façons, il n'y a pas de descripteurs de fichiers sous Windows. C'est soit des 'handles' (SOCKET, par exemple), soit des adresses de type FILE * pour les flux.

    "Tout est ficher" est un concept Unix, non repris par Windows.

    Citation Envoyé par jbarreau-mainson Voir le message
    Ok je vais tenter ça, mon but est en fait de rendre mes sockets non bloquants, j'ai vu qu'il y avait aussi la fonction WSAAsyncselect si j'ai bonne mémoire, il ne me reste plus qu'à trouver une doc !
    Le sockets asynchrones (non-bloquants), c'est compliqué à gérer. Qu'est-ce qui ne va pas avec le mode par défaut ? Si il le faut, utilise les threads. Quel est le problème exactement ?

  11. #11
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    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 397
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Si c'est pour utiliser avec select(), laisse tomber. Ca ne fonctionnera pas. De toutes façons, il n'y a pas de descripteurs de fichiers sous Windows. C'est soit des 'handles' (SOCKET, par exemple), soit des adresses de type FILE * pour les flux.

    "Tout est ficher" est un concept Unix, non repris par Windows.
    C'est inexact:
    Sous Windows, vu du kernel, tout est "objet Kernel" (donc, vu des programmes utilisateurs, "tout est handle".
    De plus, la CRT Microsoft implémente le concept de descripteurs de fichiers, en tant que surcouche par-dessus les handles (et les FILE* sont bien une surcouche par-dessus les descripteurs). Seulement, select() est faite pour marcher avec les sockets et ne supporte pas les descripteurs.

    Mais même en faisant un WaitForMultipleObjects() sur le socket (ou plus précisément un WSAEVENT) et l'entrée standard, on se retrouve avec un problème dû à la façon stupide dont l'entrée standard est gérée.
    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.

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

Discussions similaires

  1. [PEAR] Comment installer Pear sous Windows ?
    Par horri dans le forum Bibliothèques et frameworks
    Réponses: 6
    Dernier message: 27/05/2012, 17h33
  2. Les logiciels sous Linux pour remplacer ceux sous Windows
    Par Nightfall dans le forum Contribuez
    Réponses: 23
    Dernier message: 15/02/2009, 22h21
  3. Réponses: 3
    Dernier message: 13/01/2007, 14h05
  4. Comment installer GMP sous Windows?
    Par Vinchol dans le forum Autres éditeurs
    Réponses: 9
    Dernier message: 13/07/2006, 10h05
  5. Réponses: 1
    Dernier message: 27/10/2005, 09h26

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