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 :

La fonction select(), activé avec des appareils déconnectés.


Sujet :

Réseau C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 43
    Points : 89
    Points
    89
    Par défaut La fonction select(), activé avec des appareils déconnectés.
    Bonjour à tous,
    je rencontre actuellement un soucis, avec l'utilisation de socket en asynchrone, et plus particulièrement avec la fonction select.

    Ce que je veux faire, c'est de pouvoir vérifier que mes appareils sont bien accessibles sur le réseau (Je n'ai pas accès aux sources des appareils).
    Voici le code qui exécute cette action :
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    nbDevice = 0;
    // Effectue la connexion à tous les appareils
    for(i = 0 ; i < 5 ; i++) {
    	struct in_addr i_addr;
    	struct sockaddr_in s_addr;
    	struct timeval tv;
    	fd_set myset;
    	long arg;
    	int rc, fd;
     
    	// Initialise l'appareil
    	Device[i].fdEnable = false;
    	Device[i].status = OFFLINE;
     
    	if(inet_aton(Device[i].adresseIp, &i_addr) == 0) {
    		exiterr(4);
    	}
     
    	// Création de la socket
    	s_addr.sin_addr.s_addr = i_addr.s_addr;
    	s_addr.sin_family = AF_INET;
    	s_addr.sin_port = htons(80);
    	fd = socket(PF_INET, SOCK_STREAM, 0);
    	if(fd >= 0) {
    		// Configuration non bloquante
    		arg = fcntl(fd, F_GETFL, NULL);
    		arg |= O_NONBLOCK;
    		fcntl(fd, F_SETFL, arg);
    		// Connexion
    		rc = connect(fd, (struct sockaddr *) &s_addr, sizeof(s_addr));
     
    		if (rc == -1) {
    			if(errno == EINPROGRESS) {
    				// Enregistre le File descriptor
    				Device[i].fd = fd;
    				Device[i].fdEnable = true;
    				nbDevice++;
    			}
    		}
    	}
    }
     
    // Attente des réponses des appareils
    while(nbDevice) {
    	fd_set myset;
    	int nfds = 0;
    	long arg;
    	struct timeval tv;
     
    	// Initialise myset, avec tous les files descriptor en attente de réponse
    	FD_ZERO(&myset);
    	for(i = 0 ; i < 5 ; i++) {
    		if(Device[i].fdEnable) {
    			FD_SET(Device[i].fd, &myset);
    			nfds = MAX(nfds, Device[i].fd);
    		}
    	}
     
    	tv.tv_sec = 5;
    	tv.tv_usec = 0;
    	if (select(nfds+1, NULL, &myset, NULL, &tv) > 0) {
    		// Cherche l'appareil ayant répondu
    		for(i = 0 ; i < 5 ; i++) {
    			if(Device[i].fdEnable) {
    				if(FD_ISSET(Device[i].fd, &myset)) {
    					// Supprime la configuration non bloquante
    					arg = fcntl(Device[i].fd, F_GETFL, NULL);
    					arg = (~O_NONBLOCK);
    					fcntl(Device[i].fd, F_SETFL, arg);
    					close(Device[i].fd);
     
    					// Change le status de l'appareil
    					Device[i].status = ONLINE;		
    					Device[i].fdEnable = false;
     
    					nbDevice--;
    				}
    			}
    		}
    	}
    	else {
    		// Timeout
    		nbDevice = 0;
    	}
    }
    Mon problème est que si je débranche tous les appareils, j'ai toujours le status des appareils à ONLINE. La fonction select retourne une valeur positive, alors qu'aucun appareil ne peut répondre, au lieu de retourner la valeur 0, correspondant au timeout de 5 secondes.

    Je n'arrive pas à trouver mon erreur.

    Merci d'avance pour votre aide.
    Droup

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 370
    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 370
    Points : 23 625
    Points
    23 625
    Par défaut
    Hello,

    Si tu cherches à scruter les appareils « qui ont répondu », pourquoi transmets-tu ton fdset en temps que paramètre « writefds » de select() ?

    Ensuite, comment tes appareils sont-ils reliés à ta machine ? Si c'est via un ordinaire réseau TCP/IP au-dessus d'Ethernet, alors la déconnexion d'un câble ne va pas entraîner automatiquement la rupture de la connexion, qui ne sera en fait même pas détectable si l'un des protagonistes n'envoie pas un paquet entretemps. Tu pourrais alors rebrancher le câble et reprendre la transaction comme si de rien n'était. Il en va tout autrement avec une liaison point-à-point au travers d'un modem analogique, par exemple, où la rupture de la ligne entraîne la perte de la porteuse.

    La plupart des équipements Ethernet sont capables de détecter une déconnexion de câble et éventuellement de transmettre ça à la pile IP (qui renvoie alors Host Unreachable plutôt qu'une fin de non recevoir), mais ça ne remontera pas explicitement jusqu'au programme en l'absence de trafic.

Discussions similaires

  1. API Google Map démarrer une activity avec des coordonnées perso
    Par jeanjean6 dans le forum API standards et tierces
    Réponses: 6
    Dernier message: 23/08/2011, 14h05
  2. fonction non reconnue avec des imports
    Par kowalski-m dans le forum Général Python
    Réponses: 5
    Dernier message: 14/11/2009, 10h47
  3. fonction pour filtrage avec des combobox en cascade
    Par Montor dans le forum Contribuez
    Réponses: 3
    Dernier message: 09/11/2009, 12h05
  4. Select activable avec des boutons radio (IE :S)
    Par Fabthebug dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 25/09/2009, 15h49
  5. changer un textarea par fonction JS : texte avec des sauts de ligne
    Par agrotic dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 25/10/2006, 14h08

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