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 averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    43
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 43
    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
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 511
    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 511
    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, 15h05
  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, 11h47
  3. fonction pour filtrage avec des combobox en cascade
    Par Montor dans le forum Contribuez
    R�ponses: 3
    Dernier message: 09/11/2009, 13h05
  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, 16h49
  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, 15h08

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