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 :

Socket / Select / temps de reponse


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 37
    Par défaut Socket / Select / temps de reponse
    Salut a tous,

    J'utilise sur mon programme (un mini-irc tel que celui qui se trouve sur le tutoriel sur ce site) la commande select sans monitorer les actions en ecritures ni le timeout.
    j'aimerai tout de meme y ajouter une petite feature.

    J'aimerai que le client puisse effectuer une action sur le server qui demande par contre un certains temps. En fait j'aimerai que le server, apres avoir recu la requete du client, mette par exemple 5 secondes avant de lui repondre.

    J'avais pense a sleep mais cela ne peut marcher car cela bloquerait tout le server, ainsi si plusieurs clients font cette requete a 1 seconde d'intervalle, tout planterait totalement.

    Donc ma question est comment je dois proceder pour gerer ce temps de reponse du serveur en fonction du moment ou il recoit la requete du client ? Je sais qu'il s'agit d'utiliser le timeout de select, enfin je suppose mais je ne vois pas comment faire.

    si quelqu'un pouvait me donner quelques indications a suivre, je lui en serais tres reconnaissant.

    Merci

  2. #2
    Invité
    Invité(e)
    Par défaut
    Le timeout de select n'est pas la bonne solution, car si l'appel à select se termine avant le delai que tu lui as indiqué, tu n'as aucun moyen de savoir combien de temps il reste, car POSIX précise seulement que la structure timeval peut être changée, mais sans préciser de quelle façon.
    Si tu es sous Linux, il se peut que la structure soit mise à jour, mais il se peut que cela dépende des distributions, car les man ne disent pas la même chose partout.

    Bref, il te faut chercher ailleurs, par exemple du côté de la fonction alarm sous Linux.

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 477
    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 477
    Par défaut
    +1 pour les remarques de feydaykyn.

    Cela dit, les autres appels bloquants d'UNIX sont soumis aux mêmes contraintes. Un sleep(), par exemple, peut se réveiller avant terme si un signal est reçu entre temps.

    Il faut considérer d'autre part que beaucoup de choses peuvent réveiller ton processus avant terme, mais que celui-ci peut également être retardé (dans des proportions bien moindres cela dit) par les overheads dus au multitâche ou au système lui-même s'il est surchargé.

    Dans tous les cas, pour faire ce genre de choses, je m'établis un « calendrier », c'est-à-dire que je m'enquiers de l'heure courante (timestamp), que j'ajoute la durée nécessaire pour obtenir l'heure exacte à laquelle doit se produire l'événement, et je place cette valeur dans un buffer circulaire ou une liste chaînée. Les éléments de cette liste sont triés dans l'ordre chronologique, du prochain au plus lointain.

    Ensuite, je me mets en sommeil soit avec alarm(), soit avec le timeout de select(), soit directement avec sleep() si je n'ai rien d'autre à faire, pour une durée qui me permet d'atteindre le premier événement.

    Lorsque que je me fais réveiller, je m'enquéris à nouveau de l'heure courante et je solde tous les événements dont le timestamp est inférieur à la date courante. Leur nombre peut être nul si je me suis fait réveiller trop tôt, ou multiple si j'ai du retard, mais peu importe : la façon de traiter la chose est identique. Ensuite, j'examine l'échéance du prochain événement, je calcule le laps de temps qui m'en sépare, je boucle et me remets en sommeil comme indiqué au précédent paragraphe.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 37
    Par défaut
    Merci de vos reponses.
    Je vais regarder ca attentivement.

    Je vous fais signe bientot

  5. #5
    Membre Expert
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Billets dans le blog
    1
    Par défaut
    J'ai deja eu un projet de ce type a faire, sous unix aucun probleme avec le timeout du select qui te donne le temps restant, mais sous windows, effectivement on est pas assurer de ce qu'il reste.

    J'ai donc utiliser les timestamp, tu recupere le nombre de seconde ecouler entre l'appel du select et la sortie du select, tu mets a jour la liste de tes client et quand un compteur (stocker dans une structure de tes clients) passe a 0, tu envoi le message si tu veux je peux essayer de te retrouver un bout de code avec tout sa

    Edit: j'avais mal lu le commentaire d'obsidian, et donc repondu la meme chose que lui mais differemment, desoler du double mais ma proposition de code tiens toujours

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 37
    Par défaut
    Merci pour ta reponse
    oui je veux bien un extrait de code qui implemente cela.

    ps : je fais cette apply uniquement sous unix

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par skeud Voir le message
    J'ai deja eu un projet de ce type a faire, sous unix aucun probleme avec le timeout du select qui te donne le temps restant, mais sous windows, effectivement on est pas assurer de ce qu'il reste.
    Attention, la structure timeval n'est PAS mise à jour sous tous les linux, je ne connais qu'Ubuntu qui le fasse, mais ni Debian ni ArchLinux ne le font. Tu ne peux donc pas te servir de timeval pour l'utilisation que tu as en tête, à moins d'être certain que le système sur lequel sera éxécuté le programme ne change jamais.

    Pour vérifier comment agit ton système avec timeval, lit la page de man de la fonction select et s'il n'est pas écrit spécifiquement que la structure est mise à jour, ne compte pas dessus.

Discussions similaires

  1. Temps de reponse sur Select avec Jointure
    Par Guigsounet dans le forum SQL
    Réponses: 15
    Dernier message: 30/07/2010, 10h29
  2. Pb de socket : select() et send()
    Par olive_le_malin dans le forum Réseau
    Réponses: 16
    Dernier message: 11/06/2006, 11h42
  3. Réponses: 4
    Dernier message: 13/03/2006, 17h46
  4. socket & select
    Par keyra dans le forum Réseau
    Réponses: 7
    Dernier message: 29/01/2006, 16h17
  5. ameliorer le temps de reponse
    Par subzero82 dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 22/08/2005, 12h18

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