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 :

descripteurs de sockets dans un tableau


Sujet :

Réseau C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 3
    Points : 5
    Points
    5
    Par défaut descripteurs de sockets dans un tableau
    Bonjour,

    je suis en train d'écrire un programme sous linux qui doit gérer un nombre important de connections tcp.

    je souhaiterais, lors d'un évènement sur une socket, pouvoir accéder à un tableau dont l'indice est le numéro de socket concerné par l'évènement.

    Exemple: un évènement se produit sur la socket dont le descripteur est 1515.

    j'aurais besoin d'accéder à l'élément tableau[1515].

    jusque là ... c'est simple ... me direz vous. Le problème réside dans la taille du tableau à déclarer. Le descripteur de socket est un int. En conséquence, si on souhaite couvrir toutes les valeurs possible du descripteur de socket, il faut déclarer un tableau ayant 2.147.483.647 (valeur de INT_MAX dans limits.h) entrées. C’est bien entendu impossible.

    quelqu’un aurait-il une solution à m’apporter qui me permettrait de conserver un accès direct très rapide par un tableau ou suis-je condamné à mettre en place un arbre ou une liste chainée ?

    Merci d’avance pour tous vos conseils.

  2. #2
    Membre émérite
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 852
    Points : 2 298
    Points
    2 298
    Par défaut
    Tu peux toujours créer un tableau que tu ré-alloueras au besoin, mais une liste chaînée me semble être la meilleure solution.

  3. #3
    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
    Citation Envoyé par imperio Voir le message
    Tu peux toujours créer un tableau que tu ré-alloueras au besoin, mais une liste chaînée me semble être la meilleure solution.
    +1 pour la liste chainée.

    Sinon, au lieu d'utiliser le numéro de socket, tu peux utiliser le numéro de port local (c'est très facile à récupérer, c'est getsockname()), il n'y a que 65536 ports pour TCP et 65536 pour UDP.

    Je viens de faire passer ton tableau de 4 milliard potentiel à 2 X 65536, c'est un beau gain
    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
    .

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 3
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    Je trouve l'idée d'utiliser le numéro de port local très intéressante. Cependant, cela ne peut fonctionner que pour les connexions sortantes.

    Il se trouve que mon programme accepte aussi des connexions tcp (mode serveur).

    Dans ce cas, le port local est forcément toujours le même. De plus, on ne peut pas prendre le port source du client comme indice car 2 clients peuvent très bien utiliser 2 ports sources identiques.

    En guise de pis-aller j'utiliserai la liste chainée.

    Quoiqu'il en soit, je vous remercie pour le coup de main.

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 371
    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 371
    Points : 23 626
    Points
    23 626
    Par défaut
    Avant d'envisager d'allouer 2 milliards de connexions, tu peux déjà te renseigner sur le nombre total de descripteurs de fichiers que le système lui-même est capable d'allouer. Sur un Linux récent, tu trouves cela dans « /proc/sys/fs/file-max ». Sur ma machine, c'est un peu moins de 400.000, ce qui est déjà plus raisonnable. Et évidemment, « ulimit -n » qui te donne la limite imposée par défaut à un processus donné.

    Ensuite, plutôt qu'un immense tableau ou une liste chaînée un peu lourde à mettre en place et à parcourir, tu peux opter pour une structure entre les deux. Le mieux, je pense, consiste à allouer plusieurs plages de taille arbitraire, reliées entre elles par une hash table. L'idée étant de pouvoir jouer sur le compromis entre complexité de calcul et mémoire occupée.

    En outre, ce n'est pas la peine de prévoir la place pour plus de connexions que tu pourras en gérer : à raison de 1000 connexions par secondes, ce qui est énorme, il te faudrait 24 jours pour recevoir deux milliards de connexions. À titre indicatif, Developpez.com|net reçoit jusqu'à 220.000 visites par jour, ce qui fait une moyenne de… 2,5 connexions par seconde.

    À ce stade, l'indice le plus pertinent est la durée moyenne d'une de tes connexions. Si c'est du FTP, elle peuvent perdurer pendant des dizaines de minutes. Si c'est du web, une durée de vie de 2 à 3 secondes maximum suffit. À toi de multiplier ce chiffre par le nombre de connexions par seconde + une marge de sécurité pour définir une taille maximale à ton tableau, quitte à la ré-évaluer en changeant la configuration en cas de besoin.

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Il se trouve que mon programme accepte aussi des connexions tcp (mode serveur). Dans ce cas, le port local est forcément toujours le même.
    Si je ne dis pas de bêtise, ceci n'est pas vrai. Tu as un socket serveur à l'écoute sur un port donné et toutes les connexions entrantes passent par ce port. C'est le rôle de la fonction accept(), qui renvoie un nouveau descripteur de socket quand une connexion entrante a lieu. Ce socket utilise alors un port différent du port du socket serveur. Tu peux donc différencier les connexions entrantes via le port du socket de communication. C'est d'ailleurs bien pour ça que tu peux avoir des connexions entrantes simultanées sans qu'elles ne se marchent sur les pieds.

    Edit : j'ai dit des bêtises

  7. #7
    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
    Citation Envoyé par Bktero Voir le message
    Ce socket utilise alors un port différent du port du socket serveur.


    Le numéro de port local (je ne parle pas du numéro de socket) est bien le numéro de port bindé par le serveur.

    En fait, une session TCP ou UDP (pour autant que l'on puisse parler de session en UDP) est identifiée de manière unique par le quintuplet :
    • protocole (TCP ou UDP)
    • adresse IP locale
    • adresse IP distante
    • numéro de port local
    • numéro de port distant
    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
    .

  8. #8
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Bon ben j'ai dit des bêtises

    Je viens de faire des tests et j'ai compris d'où venait ma confusion : 1) de mon collègue qui me l'a dit (je balance un peu) 2) de moi qui est mal lu la doc de Python (langage avec lequel j'avais fait des tests à ce sujet).

    Petite vérification en Python.
    Client :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    import socket
    sc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    address = ('192.168.2.220', 8080)        
    sc.connect(address)
    print sc.getsockname()
    print "END CLIENT"
    --> sortie -->
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ('192.168.2.220', 49981)
    END CLIENT
    Serveur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import socket
    ss = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    ss.bind(("192.168.2.220", 8080))
    ss.listen(10)
    sc, addr = ss.accept()
    print "Get socket : ", sc
    print "Get addr: ", addr
    print
    print "Server socket : ", ss.getsockname()
    print "Communication socket : ", sc.getsockname()
    print "END SERVER"
    --> sortie -->
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Get socket :  <socket._socketobject object at 0x0000000002789180>
    Get addr:  ('192.168.2.220', 49981)
     
    Server socket :  ('192.168.2.220', 8080)
    Communication socket :  ('192.168.2.220', 8080)
    END SERVER
    La valeur de addr rendue par accept()est celle de la paire distante, ce qui est clairement écrit dans la documentation que j'avais lu trop vite : "the address bound to the socket on the other end of the connection."


    Un jour moi aussi je serai fort et omniscient

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 3
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    merci à tous pour votre aide ... précieuse.

    Une dernière question : Dois-je mettre le sujet en Résolu si les réponses apportées me conviennent ?

  10. #10
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    C'est le principe même du bouton

    Il te suffit de cliquer dessus.

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

Discussions similaires

  1. alterner les couleurs dans un tableau avec xsl
    Par Eithelgul dans le forum XSL/XSLT/XPATH
    Réponses: 14
    Dernier message: 03/05/2015, 23h29
  2. Réponses: 2
    Dernier message: 23/11/2003, 18h44
  3. Réponses: 4
    Dernier message: 10/10/2003, 18h04
  4. verification de doublons dans un tableau
    Par bohemianvirtual dans le forum C
    Réponses: 11
    Dernier message: 25/05/2002, 12h21

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