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

Linux Discussion :

suppression d'un fichier socket


Sujet :

Linux

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2008
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 74
    Par défaut suppression d'un fichier socket
    bonjour,

    je suis entrain d'écrire une application qui utilise les sockets pour émettre sur plusieurs serveurs et pour rester cohérent j'ai créé une table contenant les paramètres des différents serveurs (host,port); et puis une fonction qui émet vers l'un des serveurs, le format de la fonction est le suivant:
    int send_data(host, port, data){
    1-création socket avec host et port (host, port sont les paramètres de distinataire);
    2-émission des données; (write)
    3-fermeture de la socket ( close())
    }

    le problème c'est que, après que la fonction est executée +ieurs fois ( 1016 exactement) j'aurais le message d'erreur suivant: too many open files.

    questions:
    1-comment faire pour eviter cette erreur?
    2- y a-t-il un moyen pour supprimer un fichier (socket) à partir de son identificateur ?
    Je vous informe que je programme avec du C sous Linux.
    Merci d’avance.

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 839
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par sofiane80 Voir le message
    bonjour,

    je suis entrain d'écrire une application qui utilise les sockets pour émettre sur plusieurs serveurs et pour rester cohérent j'ai créé une table contenant les paramètres des différents serveurs (host,port); et puis une fonction qui émet vers l'un des serveurs, le format de la fonction est le suivant:
    int send_data(host, port, data){
    1-création socket avec host et port (host, port sont les paramètres de distinataire);
    2-émission des données; (write)
    3-fermeture de la socket ( close())
    }

    le problème c'est que, après que la fonction est executée +ieurs fois ( 1016 exactement) j'aurais le message d'erreur suivant: too many open files.
    Normal. Un processus est limité en nombre de fichiers ouverts en même temps.

    Citation Envoyé par sofiane80 Voir le message
    questions:
    1-comment faire pour eviter cette erreur?
    Fermer les socket non utilisées. D'ailleurs utiliser autant de socket est conceptuellement une erreur vu que tu ne communiques qu'avec un seul destinataire à la fois => une seule socket suffit. Chaque client viendra s'y connecter...

    Citation Envoyé par sofiane80 Voir le message
    2- y a-t-il un moyen pour supprimer un fichier (socket) à partir de son identificateur ?
    A partir de son nom uniquement => unlink(nom). Mais comme le problème ne vient pas de la présence physique du fichier sur le disque...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2008
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 74
    Par défaut
    J’en ai bien fais attention de fermer à chaque fois le socket (close() ), et j’ai pensé que la fonction close() sur un socket, du fait que ce dernier n’a pas de présence physique comme vous le disiez, le fait disparaitre ; mais ce qui parait ce n’est pas le cas , et voilà exactement ce que j'utilise comme fonction:

    Code C : 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
    int send_data(char *remote_host,u_short remote_port, u_char * data,int length)
    {
        int sock,n;
        struct sockaddr_in serv_addr;
        struct hostent *server;
     
     
        sock = socket(AF_INET, SOCK_STREAM, 0);
        server = gethostbyname(remote_host);
     
        bzero((char *) &serv_addr, sizeof(serv_addr));
        serv_addr.sin_family = AF_INET;
     
        bcopy((char *)server->h_addr, 
             (char *)&serv_addr.sin_addr.s_addr,
             server->h_length);
     
       serv_addr.sin_port = htons(remote_port);
     
       if (connect(sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr)) < 0) 
            error("erreur de connexion");
     
        n = write(sock,data,length);
        if (n < 0) 
             error("erreur d'ecriture dans  socket");
     
    	close(sock);
        	return n;
    }

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 839
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par sofiane80 Voir le message
    J’en ai bien fais attention de fermer à chaque fois le socket (close() ), et j’ai pensé que la fonction close() sur un socket, du fait que ce dernier n’a pas de présence physique comme vous le disiez, le fait disparaitre ; mais ce qui parait ce n’est pas le cas
    Ok. Il ne s'agit pas d'un fichier socket (de type "s") pour communiquer sur la même machine mais de socket réseau (inet) pour dialoguer inter machines. Donc on ne peut pas le supprimer vu qu'il n'existe pas physiquement. Mais le close() le ferme à condition que de l'autre coté il soit aussi fermé.

    Petite remarque en passant => on utilise un SOCK_STREAM lorsqu'on veut établir un dialogue long (qui ressemble à une communication téléphonique). Ca établit un tunnel de communication entre les deux programmes (le socket) et ensuite on envoi les données dans ce tunnel. Plus pratique mais évidemment la présence du tunnel utilise une ressource système.

    Lorsqu'on veut établir un dialogue ponctuel (qui pourrait être assimilé à un envoi de lettre) tel que tu le fais, vaut mieux utiliser les SOCK_DGRAM et passer par "sendto()" et "recvfrom()". Là, la donnée est prise en charge par le réseau au moment de l'envoi uniquement. pas de tunnel => pas de ressource consommée...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    et un close ne suffit à fermer le socket.

    shutdown enlève définitvement la connection système...

  6. #6
    Membre confirmé
    Inscrit en
    Janvier 2008
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 74
    Par défaut PROBLEME RESOLU
    bonjour,
    vous aviez tout à fait raison, le pb venait de l'autre bout de la connexion et il a fallu un close() au niveau du serveur sur le socket renvoyé par accept();

    à propos de shutdown(sock,sens);avec 3 valeurs possible pour sens:
    0:pour ne plus recevoir;
    1:pour ne plus emettre;
    2:pour ni emettre ni recevoi ce qui est equivalant à close() donc le pb ne venait pas d'ici, c'etait vraiment le close sur les deux bout de la connexion qui fait disparaitre effectivement le socket ce que je n'avais pas fais.

    merci à tous

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

Discussions similaires

  1. [VB.NET] Suppression d'un fichier chargé dans un WebBrowser
    Par Vonotar dans le forum Windows Forms
    Réponses: 9
    Dernier message: 27/09/2004, 11h09
  2. Réponses: 4
    Dernier message: 22/12/2003, 11h12
  3. Réponses: 8
    Dernier message: 14/11/2003, 22h51
  4. Réponses: 2
    Dernier message: 11/08/2003, 13h43
  5. [LG]suppression dans un fichier
    Par cedrick essale dans le forum Langage
    Réponses: 5
    Dernier message: 10/08/2003, 15h22

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