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 :

utilisation de listen()


Sujet :

Réseau C

  1. #1
    Membre régulier
    Profil pro
    INGENIEUR DE RECHERCHE
    Inscrit en
    Février 2003
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : INGENIEUR DE RECHERCHE

    Informations forums :
    Inscription : Février 2003
    Messages : 74
    Points : 87
    Points
    87
    Par défaut utilisation de listen()
    Bonjour à tous,

    Je fais un code serveur TCP. Il fonctionne bien ;-)
    Par contre j'ai du mal à comprendre le fonctionnement de la fonction "listen(s,i)"
    Elle est censée renvoyer un message d'erreur suand le nombre de connexion entrant est > i.

    Le code en cause :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
            if(listen(sock,2) != 0)
    	{
    		fprintf(stderr,"%s listen %s", argv[0], strerror(errno));
    		return 1;
    	}
    	while(1)
    	{
    		struct sockaddr_in client; 
    		socklen_t len = sizeof(client);
    		int sock_pipe; 
    		int ret, nb_question;
    		sock_pipe = accept(sock, (struct sockaddr *) &client, &len);
    Question 1 :
    Pourquoi positionner la fonction avant la boucle comportant accept()? l'erreur n'est plus gérée une fois la fonction exécutée?

    Question 2 :
    Que veux dire, dans le man : "... le client reçoit une erreur indiquant ECONNREFUSED, ou, si le protocole sous-jacent supporte les retransmissions, la requête peut être ignorée afin qu'un nouvel essai réussisse. " ?
    Celà signifie t-il que si le nombre de connexion et >i alors le client essai plusieurs fois jusqu'à être accepté dans la file d'attente?

    Merci d'avance pour vos réponses
    Spiale

  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
    Bonsoir,

    Citation Envoyé par spiale Voir le message
    Bonjour à tous,

    Je fais un code serveur TCP. Il fonctionne bien ;-)
    Par contre j'ai du mal à comprendre le fonctionnement de la fonction "listen(s,i)"
    Elle est censée renvoyer un message d'erreur suand le nombre de connexion entrant est > i.
    C'est le client qui reçoit un message d'erreur si la file est pleine. Ça veut simplement dire que si tu spécifies une longueur maximum à la file d'attente, le système lui-même renverra un message correspondant en gros à « toutes nos lignes sont actuellement occupées » à l'homologue sans que le programme lui-même en ait conscience.

    Question 1 :
    Pourquoi positionner la fonction avant la boucle comportant accept()? l'erreur n'est plus gérée une fois la fonction exécutée?
    Parce que listen() sert simplement à mettre le socket concerné en mode « écoute ». La fonction ressort donc immédiatement, en principe, que ce soit avec un code d'erreur ou de succès.

    Question 2 :
    Que veux dire, dans le man : "... le client reçoit une erreur indiquant ECONNREFUSED, ou, si le protocole sous-jacent supporte les retransmissions, la requête peut être ignorée afin qu'un nouvel essai réussisse. " ?
    Celà signifie t-il que si le nombre de connexion et >i alors le client essai plusieurs fois jusqu'à être accepté dans la file d'attente?
    Ça veut dire que « c'est une éventualité » dans le cas où le protocole utilisé permet de faire ces choses-là et que, donc, il est possible que le système choisisse alors de se comporter comme si le paquet avait été perdu. Mais c'est très théorique et je ne vois pas, personnellement, à quel cas de figure particulier cet exemple fait référence.

  3. #3
    Membre régulier
    Profil pro
    INGENIEUR DE RECHERCHE
    Inscrit en
    Février 2003
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : INGENIEUR DE RECHERCHE

    Informations forums :
    Inscription : Février 2003
    Messages : 74
    Points : 87
    Points
    87
    Par défaut
    Bonjour,

    Merci beaucoup pour ces précision Obsidian.

    Je viens de tester 4 connexions clients simultanées, avec un listen(s,2) dans le code serveur.
    Le client n'affiche pas de retour erreur, il se met en attente et envoie les messages quand le serveur est dispo.
    Le code serveur est simple sans processus fils.

    Une explication?

    Merci, encore.
    Spiale

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par spiale Voir le message
    Je viens de tester 4 connexions clients simultanées, avec un listen(s,2) dans le code serveur.
    Le client n'affiche pas de retour erreur, il se met en attente et envoie les messages quand le serveur est dispo.
    Le code serveur est simple sans processus fils.
    Lorsque le nombre de connexion dépasse la limite, les requêtes clients "attendent" d'être traitées ou partent en timeout (après quelques minutes).
    Mais avec de la patience, vous devriez pouvoir tester facilement cela.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    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
    Citation Envoyé par spiale Voir le message
    Je viens de tester 4 connexions clients simultanées, avec un listen(s,2) dans le code serveur.
    Le client n'affiche pas de retour erreur, il se met en attente et envoie les messages quand le serveur est dispo.
    Le code serveur est simple sans processus fils.
    On a vu que c'était un comportement qui pouvait se produire.

    Citation Envoyé par wiztricks Voir le message
    Lorsque le nombre de connexion dépasse la limite, les requêtes clients "attendent" d'être traitées ou partent en timeout (après quelques minutes). Mais avec de la patience, vous devriez pouvoir tester facilement cela.- W
    Justement : c'est à cela que le paramètre backlog est censé servir.

    Citation Envoyé par spiale Voir le message
    Une explication?
    Ça va dépendre essentiellement à la fois du protocole que tu utilises et du système d'exploitation sous lequel ton programme fonctionne, car l'attitude à adopter va être laissée en partie à la discrétion de ce système et de l'implémentation de son réseau. Dans les notes de la man page Linux, par exemple, on lit :

    Citation Envoyé par man 2 listen
    Le comportement de backlog a été modifié sur les sockets TCP dans Linux 2.2. Il s'agit à présent de la longueur de la file d'attente pour les socket totalement établies en
    attente d'acceptation, plutôt que les requêtes de connexion incomplètes. La longueur maximale de la file d'attente des connexions incomplètes peut être configurée avec
    /proc/sys/net/ipv4/tcp_max_syn_backlog. Lorsque les syncookies sont activés, il n'y a pas de longueur maximale et la configuration est ignorée. Consultez tcp(7) pour plus de
    détails.

    Si l'argument backlog est plus grand que la valeur indiquée dans le fichier /proc/sys/net/core/somaxconn, il est tronqué à cette valeur ; la valeur par défaut dans ce
    fichier est 128. Dans les noyaux précédant 2.4.25, cette limite était une valeur fixe, SOMAXCONN, qui valait également 128.

  6. #6
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Pour tester le fonctionnement du backlog, je pense qu'il faut faire un programme spécifique qui fait listen() mais jamais accept() en sortie de listen() ainsi, le backlog va se remplir.

    Normalement avec un backlog de 2, tu vas pouvoir initier 2 connexions client (initier seulement puisqu'il n'y a pas de accept). La 3eme devrait se faire jeter immédiatement (les 2 autres vont se faire jeter plus tard avec un timeout (2 ou 3 minutes)
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

Discussions similaires

  1. Appel de plugins utilisant un listener
    Par melye dans le forum ImageJ
    Réponses: 0
    Dernier message: 23/06/2011, 10h41
  2. Utilisation des listener sur les objets UML
    Par sanchou dans le forum UML
    Réponses: 2
    Dernier message: 11/08/2010, 16h48
  3. Utilisation des Listeners
    Par demcoul dans le forum Langage
    Réponses: 2
    Dernier message: 02/08/2007, 20h51
  4. [JInternalFrame] quel Listener utilise ?
    Par lanfeustdetroll dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 11/07/2005, 17h09
  5. [JEditorPane] Quel listener utiliser?
    Par Pill_S dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 27/07/2004, 13h32

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