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 :

Serveur/Clients avec sockets


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 65
    Points : 38
    Points
    38
    Par défaut Serveur/Clients avec sockets
    Bonjour,

    J'ai un serveur et plusieurs clients qui communiquent par sockets. La méthode d'implémentation est la méthode 1 thread + select.
    Mon problème est le suivant:
    - Il y a des cas où le serveur doit émettre un message à un client et celui-ci doit lui répondre avec un ACK. Cependant, la réponse peut ne pas se faire immédiatement, selon le traitement qui est en cours côté client. Mais le serveur ne peut pas se permettre d'attendre la réponse du client, car étant donné qu'il s'agit d'une implémentation 1 Thread + select, cela bloquerait toutes les communications avec les autres clients. Je cherche donc le meilleur moyen d'attendre une réponse de façon asynchrone côté serveur, et de gérer un timeout en cas de non-réponse. Et ce, pour tous les clients connectés, ce qui implique (ou pas) un timer pour chaque message émis aux clients.

    En bricolant un peu, je pense qu'il y a plusieurs méthodes, mais ayant peu d'expériences, je me demandais si qqn d'entre vous aurait déjà géré un tel cas.

    Julien.

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Bonjour,

    Si c'est des ACK du protocole TCP tu n'as pas à t'en chargé, c'est une couche réseau inférieur qui s'en occupe.

    Pour des timeout je vois 2 solutions :
    - utiliser boost qui a une utilisation bien plus pratique pour les socket et les timeout (Qt le fait aussi).
    - mettre un timeout au select (si il est atteint, supprimer tous les socket) sinon on regarde le temps avec un autre temps enregistré de sorte que tous les 2 secondes (valeur arbitraire) on regarde si tous les sockets ont déjà envoyé un message (en gros un tableau de booléen qui tu met à false toutes les deux secondes et que tu met à true dès qu'un message arrive).

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 65
    Points : 38
    Points
    38
    Par défaut
    En ce qui concerne le ACK, je parle bien d'un ACK émis par le client pour informer le serveur que le traitement correspondant à la commande s'est bien déroulé.

    Après, étant en environnement temps réel / systèmes embarqués, avec une limitation de mémoire, je ne peux pas utiliser boost.

    Je vais partir sur ta dernière solution.

    Julien.

  4. #4
    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
    Je ne vois pas le problème.

    Select a pour but de te dire si une action c'est faite sur un fd, soit tu vas lire sur le socket que si select te dit qu'il y a qlq chose à lire.

    Si read renvoie -1 alors tu as une déco.

    Le select est la normalement pour faire de l'écoute non bloquante sur plusieurs fd (socket), c'est justement pour évite de faire un thread par connexion.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 65
    Points : 38
    Points
    38
    Par défaut
    Certes, le select à un timeout pour être non bloquant. Mais ce timeout est unique. Par exemple:

    J'ai le serveur S et deux clients C1 et C2.
    - C1 se connecte à S.
    - S lui envoi un message, et doit recevoir un ACK de C1 dans un temps max défini (-> démarrage timer ?).
    - C2 se connecte à S.
    - S lui envoi un message, et doit recevoir un ACK de C2 dans un temps max défini (-> démarrage timer ?).

    Plusieurs cas:
    - C1 ne répond pas d'ACK.
    - C1 répond avant C2.
    - C2 répond avant C1.
    - C2 ne répond pas d'ACK.

    J'imagine bien une thread supplémentaire qui gère les timers (ou le timer) et qui déclenche le select en cas de timer expiré. Mais voila, je me demandais si qqn avait déjà utilisé certaines méthodes pour gérer cela.

    Est-ce plus clair ?

    Julien.

  6. #6
    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
    Je suis pas vraiment sur de comprendre donc ont va reprendre point par point une exécution select.

    En gros tu as un struct avec ton socket et un timer que tu lis sur le socket timer = 0;

    Tu as ensuite trois timer un pour avant select, un pour après la soustraction des 2 te donne le tps passé.
    Le 3eme c'est le timeout de ton select = le tps le plus court que tu attend.

    Ensuite le timer attaché a ton socket += la soustraction des 2 autres.

    et le troisieme et égale a temps max - le timer attaché à ton socket le plus haut.

    si timer attaché au socket >= tps max alors timeout

    Et quand tu lis un socket alors tu remet le timer à zéro

    je te rappel que tu lis un socket que si il est isset de mémoire.

    Voila en esperant être clair

Discussions similaires

  1. Besoin d'idées sur appli serveur/clients avec sockets
    Par lou_delphdev dans le forum Web & réseau
    Réponses: 6
    Dernier message: 16/03/2011, 17h14
  2. Serveur/Clients avec Base SQL : organisation
    Par aristeas dans le forum Général Java
    Réponses: 3
    Dernier message: 10/02/2010, 13h54
  3. Problème communication serveur/client avec Socket
    Par Nicolas74 dans le forum Entrée/Sortie
    Réponses: 0
    Dernier message: 03/12/2009, 16h54
  4. Serveur/Client avec Indy 10
    Par topgun1223 dans le forum Web & réseau
    Réponses: 2
    Dernier message: 24/04/2009, 18h18
  5. Probleme Serveur/Multi-client avec socket
    Par CouaC dans le forum Réseau
    Réponses: 9
    Dernier message: 18/06/2007, 00h49

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