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 :

Je ne comprends pas ceci dans les sockets en C


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Octobre 2015
    Messages : 7
    Par défaut Je ne comprends pas ceci dans les sockets en C
    Bonjour, j'ai suivi le cours sur les sockets en C de developpez.com : http://broux.developpez.com/articles/c/sockets/ . Et dans l'exemple de serveur TCP/IP qu'il donne, je ne comprends pas l'intérêt de ce if ternaire : max = csock > max ? csock : max;
    Ainsi que l'intérêt de l'instruction qui suit le if ternaire : FD_SET(csock, &rdfs);


    Si quelqu'un pouvait m'éclairer là-dessus ça serait sympa !

    Merci d'avance ! (je suis un grand débutant en programmation)

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 485
    Par défaut
    Bonjour et bienvenue,

    La réponse se trouve dans la section 4.1 du cours que tu cites.

    FD_SET() est une macro qui sert à marquer les descripteurs à faire surveiller par l'appel select() qui, lui, n'est pas spécialement lié aux sockets en particulier mais qui trouve quand même son usage principal dans leur domaine. Pour faire simple, select() est un appel bloquant, comme les accès sur les fichiers (ou flux) ordinaires, et qui se débloque dès lors qu'une opération spécifiée (lecture, écriture, ou cas spéciaux) cesserait elle-même d'être bloquante si elle était effectuée individuellement sur au moins un des descripteurs fournis.

    Autrement dit, select() se met à l'écoute de tous les descripteurs fournis en même temps et rend la main dès que l'un d'eux est disponible. On comprend que ça va être particulièrement utile dans le cas de la gestion d'un serveur aux multiples clients.

    Or, les descripteurs de fichiers proprement dits ne sont que des entiers servant d'index dans un grand tableau. Tous les descripteurs ouverts ne sont pas concernés par l'appel mais surtout, il n'y a rien a priori qui nous informe sur la taille du tableau ni sur le nombre total de descripteurs ouverts possédés par un processus. Par conséquent, select() demande à recevoir en argument « le numéro du plus grand descripteur à gérer + 1 ». Et comme accept() gère chaque nouvelle connexion entrante à l'aide d'un socket propre, on reçoit à chaque fois un nouveau numéro.

    La ligne en question sert donc uniquement à garder trace du plus haut numéro de descripteur actuellement géré pour pouvoir en informer select().

    FD_SET() sert ensuite à indiquer, dans cette plage de 0 à n, quels sont les descripteurs qui nous intéressent vraiment. En outre, il faut le faire à chaque tour car une fois appelé, tous les flags dressés par FD_SET() sont remis à zéro et parce que select() se sert de ce même moyen pour indiquer, en retour, quels sont les descripteurs qui se sont débloqués, car il peut y en avoir plusieurs à la fois.

    Bon courage.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Octobre 2015
    Messages : 7
    Par défaut
    Merci beaucoup !!! Mais je n'ai toujours pas compris ceci :

    "FD_SET() sert ensuite à indiquer, dans cette plage de 0 à n, quels sont les descripteurs qui nous intéressent vraiment. En outre, il faut le faire à chaque tour car une fois appelé, tous les flags dressés par FD_SET() sont remis à zéro et parce que select() se sert de ce même moyen pour indiquer, en retour, quels sont les descripteurs qui se sont débloqués, car il peut y en avoir plusieurs à la fois."

    de qu'elle plage parles-tu ? pour la ligne : "FD_SET(csock, &rdfs);" la seule chose que je pense avoir compris, c'est qu'on ajoute un socket d'un nouveau client à notre ensemble de descripteurs de fichiers nommé "rdfs", et que aussitôt ce socket ajouté, on remet à 0 rdfs. Donc déjà là je vois pas trop l'intérêt d'ajouter si c'est pour l'enlever aussitôt Je suis un grand débutant, j'imagine que pour toi ce que tu me dis te parait évident !

    Merci

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 485
    Par défaut
    Citation Envoyé par VicPi Voir le message
    de qu'elle plage parles-tu ? pour la ligne : "FD_SET(csock, &rdfs);" la seule chose que je pense avoir compris, c'est qu'on ajoute un socket d'un nouveau client à notre ensemble de descripteurs de fichiers nommé "rdfs",
    En fait, on va surtout « marquer » le descripteur en question dans l'ensemble rdfs (qui devrait en toute logique être nommé « rfds » d'ailleurs) de façon à demander à select() de le surveiller avec les autres.

    et que aussitôt ce socket ajouté, on remet à 0 rdfs. Donc déjà là je vois pas trop l'intérêt d'ajouter si c'est pour l'enlever aussitôt Je suis un grand débutant, j'imagine que pour toi ce que tu me dis te parait évident !
    Effectivement, après une vérification plus approfondie, il semble qu'à cet endroit précis, le FD_SET() ne sert à rien… Il y a quelques autres erreurs, notamment le fait d'utiliser des conditions exclusives « if … else if … else » pour traiter le résultat de select(), ce qui fait que tout ce qui est envoyé par les clients déjà connectés au moment où le client suivant arrive est perdu.

    Il a d'autres ressources concernant ce sujet disponibles ici, comme cette discussion qui avait permis de mettre pas mal de choses en lumière.

    Bon courage.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Octobre 2015
    Messages : 7
    Par défaut
    D'accord, merci beaucoup, je vais aller voir ton lien quand j'aurai le temps, en espérant qu'il me soit utile

    Sinon, aurai tu un autre code de serveur/client TCP / IP, si possible un chat, sans erreur ?

    à moins que ton lien me permette de corriger ces erreurs ?

    car en fait, qu'est ce que je dois modifié finalement dans mon code ?


    Merci bcp encore une fois !

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 485
    Par défaut
    Citation Envoyé par VicPi Voir le message
    D'accord, merci beaucoup, je vais aller voir ton lien quand j'aurai le temps, en espérant qu'il me soit utile

    Sinon, aurai tu un autre code de serveur/client TCP / IP, si possible un chat, sans erreur ?
    J'ai posté le mien à la page 3 de ladite discussion. :-)

    à moins que ton lien me permette de corriger ces erreurs ?
    car en fait, qu'est ce que je dois modifié finalement dans mon code ?
    Pour te répondre, il faudrait qu'on puisse jeter un œil dessus.
    Poste-le ici, encadré par les balises [code] et [/code] (avec le bouton « # » de l'éditeur de message) et on tâchera de t'aider.

    Bon courage.

Discussions similaires

  1. Réponses: 17
    Dernier message: 03/09/2006, 19h46
  2. Réponses: 2
    Dernier message: 26/07/2006, 10h53
  3. Réponses: 4
    Dernier message: 11/07/2006, 21h43
  4. ne pas ecrire dans les fichier log
    Par HULK dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 07/04/2006, 08h22
  5. Je ne comprend pas très bien les templates...
    Par Paulinho dans le forum C++
    Réponses: 5
    Dernier message: 07/11/2005, 10h24

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