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 :

fonction select() pour gérer le temps pour un réseau


Sujet :

Réseau C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 35
    Points : 24
    Points
    24
    Par défaut fonction select() pour gérer le temps pour un réseau
    Bonjour,

    Je voudrais tester la connectivité pour une machine, de sorte que si une machine B ne reçoit pas des des données (dans mon exemple des ping) d'une machine A au bout de 5s alors je pourrai exécuter des commandes (dans mon cas des règles de filtrage)

    Pour se faire je pense utiliser la fonction select, voici mon code :

    je mets les paquets reçu de la machine B dans la NFQUEUE(iptables)
    et fd = nfq_fd(h) et le descripteur de la socket pour le lien entre la NFQUEUE et le programme utilisateur

    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
    17
    18
    19
    20
    21
    22
    23
    fd = nfq_fd(h);
     
       fd_set rfds;
        struct timeval tv;
        int retval;
     
        /* Surveiller stdin (fd 0) en attente d'entrées */
        FD_ZERO(&rfds);
        FD_SET(fd, &rfds);
        /* Pendant 5 secondes maxi */
        tv.tv_sec = 5;
        tv.tv_usec = 0;
    	retval = select(fd+1, &rfds, NULL, NULL, &tv);
     
     
     
        while(retval){
     
    	if ((rv = recv(fd, buf, sizeof(buf), 0)) && rv >= 0) {
    		printf("pkt received\n");
    		nfq_handle_packet(h, buf, rv);}
    	retval = select(fd+1, &rfds, NULL, NULL, &tv);
    	}
    Quand la machine B envoie des pings à A, il passe par la NFQUEUE et sont traités dans ce programme, mais on ne peut recevoir les paquets que pendant 5s et apres il sort de la boucle

    Je pense que c'est une erreur de paramètres qui fait que recv=0 tout le remps

    Ce que je veux, c'est quand j'arrête de pinger, le programme sort du while au bout de 5s pour que je puisse exécuter de nouvelles commandes

    Actuellement, il sort automatiquement au bout de 5s même quand il reçoit toujours des ping

    Merci

  2. #2
    Membre émérite
    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 : 34
    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
    Points : 2 724
    Points
    2 724
    Billets dans le blog
    1
    Par défaut
    Ce post devrait être dans le forum c reseau

    En tout cas si tu cherches touours la réponse:

    Il faut qu'à chaque reception de paquet tu réinitialise ton compteur de temps.

    Au lieu de le mettre en dehors de ta boucle met la l'initialisation du compteur au début de ta boucle
    Pas de solution, pas de probleme

    Une réponse utile (ou +1) ->
    Une réponse inutile ou pas d'accord -> et expliquer pourquoi
    Une réponse à votre question


  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 35
    Points : 24
    Points
    24
    Par défaut
    bonjour en fait c'est resolu je n'ai pas utilisé select

  4. #4
    Membre émérite
    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 : 34
    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
    Points : 2 724
    Points
    2 724
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par albertopisto Voir le message
    bonjour en fait c'est resolu je n'ai pas utilisé select
    Pas de select pour le reseaux? Attention il se peut que ça soit mal
    Pas de solution, pas de probleme

    Une réponse utile (ou +1) ->
    Une réponse inutile ou pas d'accord -> et expliquer pourquoi
    Une réponse à votre question


  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 12
    Points : 8
    Points
    8
    Par défaut select > 120 sec. not possible???
    Bonjour,

    J'ai moi aussi un problème avec le select() mais dans mon cas il ne respect pas le temps que je lui indique. Dans la structure qui sert au timeout je définie un timeout de 600 sec (normalement, le select doit etre bloquant pendant 600sec.). mais le select() me rend la main au bout de 120 sec. avec un résultat égale à 1 alors qu'il n'y a rien sur a traiter dans la socket puisqu'un recv après retourne une erreur. Ma question est la suivante y a t'il une limite sur les systèmes Windows qui fixe la limite du select() à 120 sec.? ou alors il y a autre chose mais je vois pas quoi.

    Merci par avance pour votre aide.

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 369
    Points : 23 623
    Points
    23 623
    Par défaut
    Citation Envoyé par noxious Voir le message
    Ma question est la suivante y a t'il une limite sur les systèmes Windows qui fixe la limite du select() à 120 sec.? ou alors il y a autre chose mais je vois pas quoi.
    Ton programme-serveur, qui utilise select(), tourne-t-il sous Windows ? Si non, il se peut qu'il reçoive un signal entretemps et venant d'autre chose, ce qui débloque l'appel système.

    Si select() te renvoie 1, cela dit, c'est qu'au moins un des descripteurs est signalé. Il faut se souvenir que tu sais qu'une connexion en lecture a été refermée lorsqu'un appel valide à read() t'a renvoyé zéro octets.

    Il est donc fort probable que ce soit le client connecté à ton serveur qui ait décidé de raccrocher.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    Mon client tourne sous windows c'est lui qui fait le select avec le timeout de 600sec. Mon server lui tourne sous vxworks.

    Un peu plus d'info:
    L’opération en question est la suivante: mon client envoi un fichier par petit morceaux au serveur qui le stock en RAM. Le dernier morceau du fichier envoyé par le client déclenche coté serveur l’écriture sur la flash. Suivant l’état de la flash l’écriture peut durer très... très... longtemps... d'ou le timeout de 600 sec. mais au bout de 120sec le select() coté client rend la main alors que l’écriture en flash est tjrs en cours coté serveur.

    Pourquoi le client décide t'il de raccrocher? A cause d'un signal?

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 27/01/2012, 15h32
  2. Serveur pour gérer 10 postes sur un réseau
    Par paikan06 dans le forum Serveurs (Apache, IIS,...)
    Réponses: 4
    Dernier message: 21/12/2011, 08h54
  3. Réponses: 6
    Dernier message: 28/09/2010, 10h07
  4. [Enseignement] Quel outil pour gérer des comptes pour des TP de développement web ?
    Par Hervé Saladin dans le forum Serveurs (Apache, IIS,...)
    Réponses: 2
    Dernier message: 19/05/2008, 01h43
  5. Comment vous faites pour gérer votre temps?
    Par implosion dans le forum Emploi
    Réponses: 12
    Dernier message: 10/01/2006, 18h31

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