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 :

Pb avec socket - too many open files


Sujet :

Réseau C

  1. #1
    Membre régulier Avatar de be_tnt
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    312
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 312
    Points : 84
    Points
    84
    Par défaut Pb avec socket - too many open files
    Bonjour!

    De si bon matin, j'attaque dur. J'ai développé une librarie en C. Je ne m'y connais pas beacoup sur ce point. Actuellement cette library contient 2-3 fonctions appelés par un autre programme (que je ne contrôle pas). En fait cette librarie est utilisé pour rediriger une demande d'accès vers un daemon écrit en Java. Le tout est basé sur UDP. Mon problème est qu'à chaque tentative de connection ma librairie crée un nouveau datagram socket. Résultat: si un user s'amuse à lancer en bloque des tentatives de connection, un moment donné, j'obtiens le message "Too many open files" et donc je ne sais plus créer de nouvelle socket. Maintenant ce que je cherche à faire est de ne créer qu'un seul socket et de le ré-utiliser. Est-ce possible? Si oui, comment je peux faire? En Java, j'utiliserai le constructeur de classe pour initialiser mon objet une seule fois. mais en C???

  2. #2
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 119
    Points
    28 119
    Par défaut
    Bonjour,

    Je ne suis pas bien sur de comprendre exactement ce qui te pose problème : lorsque tu ouvres une socket, tu récupères son identifiant. Ensuite, pour écrire sur cette socket, tu écris sur cet identifiant, dans le genre de ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    send(identifiant_de_socket, "Hello world!\n", .........);
    Un bon début sur les sockets : http://c.developpez.com/WalrusSock/
    Une bonne suite, en anglais : http://beej.us/guide/bgnet/
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  3. #3
    Membre régulier Avatar de be_tnt
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    312
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 312
    Points : 84
    Points
    84
    Par défaut
    huh il sembelerait que le problème vient d'un fichier que j'ouvre et qu'apparemment le fd ne se ferme pas correctement. Avec la commande lsof, je vois ce fichier ouvrt un nombre impressionnant de fois :s

    Ce que je comprends pas est que je fais fclose. J'ai même ajouté juste après fd = NULL. Mais ça ne change rien

    Comme il s'agit d'une library, est-ce qu'il y a d'autres choses à faire?

  4. #4
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par be_tnt
    J'ai développé une librarie en C.
    On dit bibliothéque.




    Pourquoi ne pas utiliser close?

    C'est soit à toi de faire une fonction qui referme les sockets, de façon interne ou alors que l'utilisateur appelle une fonction qui le fera.

    Soit tu laisses l'utiliser fermer la socket avant de rappeler tes fonctions...

    Jc

  5. #5
    zul
    zul est déconnecté
    Membre éclairé Avatar de zul
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    498
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 498
    Points : 699
    Points
    699
    Par défaut
    Pourquoi ne fais tu pas exactement la même chose en C ? Evidemment tout n'est pas automatique en C mais les bonnes pratiques de programmation peuvent rester.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #define INVALID_SOCKET -1
     
    static int my_socket = INVALID_SOCKET;
     
    if ( my_socket == INVALID_SOCKET )
         my_socket = socket( ... );
    Que tu peux encapsuler dans une fonction init_socket ( si tu veux faire d'auter traitement ... ).

  6. #6
    Membre régulier Avatar de be_tnt
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    312
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 312
    Points : 84
    Points
    84
    Par défaut
    humm désolé si l'anglais prend le pas sur le français parfois ....

    Comme dit dans mon précédent message, le pb semble venir d'un FD qui ne serait pas correctement libéré mais je fais déjà fclose(fd) et même fd = NULL.

  7. #7
    Membre régulier Avatar de be_tnt
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    312
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 312
    Points : 84
    Points
    84
    Par défaut
    Citation Envoyé par zul
    Pourquoi ne fais tu pas exactement la même chose en C ? Evidemment tout n'est pas automatique en C mais les bonnes pratiques de programmation peuvent rester.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #define INVALID_SOCKET -1
     
    static int my_socket = INVALID_SOCKET;
     
    if ( my_socket == INVALID_SOCKET )
         my_socket = socket( ... );
    Que tu peux encapsuler dans une fonction init_socket ( si tu veux faire d'auter traitement ... ).
    euh je suppose que là c'est plus du C++, non?

  8. #8
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par be_tnt
    euh je suppose que là c'est plus du C++, non?
    Euh non c'est bien du C...
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  9. #9
    Membre régulier Avatar de be_tnt
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    312
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 312
    Points : 84
    Points
    84
    Par défaut
    Citation Envoyé par Skyrunner
    Euh non c'est bien du C...
    bon j'avoue .... je suis nulle en C

  10. #10
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par be_tnt
    huh il sembelerait que le problème vient d'un fichier que j'ouvre et qu'apparemment le fd ne se ferme pas correctement. Avec la commande lsof, je vois ce fichier ouvrt un nombre impressionnant de fois :s

    Ce que je comprends pas est que je fais fclose. J'ai même ajouté juste après fd = NULL. Mais ça ne change rien

    Comme il s'agit d'une library, est-ce qu'il y a d'autres choses à faire?
    Euhhh depuis quand des sockets sont des pointeurs?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
           int socket(int domain, int type, int protocol);
    Il faudrait pas utiliser close et non fclose?

    Jc

  11. #11
    Membre régulier Avatar de be_tnt
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    312
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 312
    Points : 84
    Points
    84
    Par défaut
    euh en fait là je parlais de fichier réellement et pas de socket ....

  12. #12
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par be_tnt
    euh en fait là je parlais de fichier réellement et pas de socket ....
    Bon il serait peut-être temps de demander un code réduit au minimum, compilable qui montre le problème?

    Jc

  13. #13
    Membre régulier Avatar de be_tnt
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    312
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 312
    Points : 84
    Points
    84
    Par défaut
    alors voici la partie du code qui ouvre le fichier, extrait l'info pis ferme ce fichier:

    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
     
    /*
     * Retrieve the UDP port to which requests
     * must be sent.
     * Return the port number or -1 if failed
    */
    int getPort(char* path) {
       FILE *fb;
       char ligne[20];
       char filename[50];
     
       /* Build the filename */
       strncpy(filename,path,sizeof(filename)-1);
       strncat(filename,"/etc/.authServerPort",sizeof(filename)-1-strlen(path));
     
       /* Retrieve the UDP port to which send the authentication request */
       if ( (fb = fopen(filename,"r")) == NULL) {
          /* Log the error message */
          if ( DEBUG == 1 ) {
             fprintf(logfile , "ERROR: Can not open port file: %s\n", strerror(errno));
             fflush(logfile);
             fclose(logfile);
          }
          return -1;
       } else {
          /* read the UDP port */
          if (fgets(ligne,sizeof(ligne),fb) != NULL) {
             return strtol(ligne,NULL,10);
             fclose(fb);
             fb = NULL;
          } else {
             /* Log the error message */
             if (DEBUG == 1) {
                fprintf(logfile , "ERROR: Can not read port file: %s\n", strerror(errno));
                fflush(logfile);
                fclose(logfile);
             }
             fclose(fb);
             fb = NULL;
             return -1;
          }
       }
    }

  14. #14
    Membre régulier Avatar de be_tnt
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    312
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 312
    Points : 84
    Points
    84
    Par défaut
    La commande lsof montre que .authServerPort est toujours "ouvert"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    qip-login 15965 root  254r  VREG   32,4  5 3994687 /opt/qip/etc/.authServerPort

  15. #15
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    return strtol(ligne,NULL,10);
             fclose(fb);
             fb = NULL;
    Ca ne te paraît pas suspect comme code?

  16. #16
    Membre régulier Avatar de be_tnt
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    312
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 312
    Points : 84
    Points
    84
    Par défaut
    Citation Envoyé par fearyourself
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    return strtol(ligne,NULL,10);
             fclose(fb);
             fb = NULL;
    Ca ne te paraît pas suspect comme code?
    euh maintenant que tu le dis

  17. #17
    Membre régulier Avatar de be_tnt
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    312
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 312
    Points : 84
    Points
    84
    Par défaut
    Alors j'ai modifié cette partie de code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int port = strtol(ligne,NULL,10);
    fclose(fb);
    fb = NULL;
    return port;
    et en plus ça marche

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

Discussions similaires

  1. Lecture de properties - Too many open files
    Par Romz_Java dans le forum Collection et Stream
    Réponses: 8
    Dernier message: 08/07/2011, 11h39
  2. IOError: [Errno 24] Too many open files -> Comment debugger ?
    Par Mistervanhalen dans le forum Général Python
    Réponses: 8
    Dernier message: 26/02/2009, 17h25
  3. [Tomcat 5.0.28] ZipException: Too many open files
    Par maloups dans le forum Tomcat et TomEE
    Réponses: 0
    Dernier message: 14/11/2008, 16h47
  4. Too many open files
    Par ppmaster dans le forum Weblogic
    Réponses: 1
    Dernier message: 11/09/2007, 14h17
  5. [Système] failed to open stream: Too many open files
    Par shamanlinks dans le forum Langage
    Réponses: 7
    Dernier message: 23/05/2006, 11h59

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