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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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
    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 Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    875
    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 : 875
    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 : 62
    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
    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
    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
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 504
    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 504
    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
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 498
    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

+ 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