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 :

Socket netstat TIME_WAIT [Non suivi]


Sujet :

Réseau C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 12
    Points : 5
    Points
    5
    Par défaut Socket netstat TIME_WAIT
    Bonjour,

    J'ai un petit problème de client serveur sous linux.
    Mon application est simple je souhaite envoyer un log sur le reseau tant que le client est connecté. J'ai un programme qui tourne bien sauf si c'est le serveur qui prend l'initiative de fermer la connexion.
    Je souhaite savoir comment est ce que le serveur peut fermer les sockets clientes proprement c'est à dire sans que netstat me donne un état TIME_WAIT, et donc bind qui me jette dès que je relance mon serveur.

    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
    44
    45
    46
     
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <string.h>
    #include <unistd.h>
     
    int main(void)
    {
        int Sock_srv, Sock_clt;
        int length, i;
        struct sockaddr_in Addr_srv;
        struct sockaddr Addr_clt;
     
        if((Sock_srv = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    	return(-1);
     
        bzero(&Addr_srv, sizeof(Addr_srv));
        Addr_srv.sin_family = AF_INET;
        Addr_srv.sin_addr.s_addr = INADDR_ANY;
        Addr_srv.sin_port = htons(6666);
     
        length = sizeof(Addr_srv);
        if (bind(Sock_srv,(struct sockaddr*)&Addr_srv, length) != 0)
        {
    	close(Sock_srv);
    	return(-1);
        }
     
        listen(Sock_srv, 1);
     
        bzero (&Addr_clt, sizeof(Addr_clt));
        length = sizeof(Addr_clt);
        Sock_clt = accept(Sock_srv, &Addr_clt, (socklen_t*) &length);
     
        for(i=0; i < 20; i++)
        {
        	 if(write(Sock_clt, "123456789\r\n", strlen("123456789\r\n")) < 0)
        	     break;
        	 sleep(1);
        }
        close(Sock_clt);
        close(Sock_srv);
     
        return (0);
    }
    Merci d'avance.

  2. #2
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    le close ne ferme pas définitivement. C'est le shutdown qui ferme définitivement...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Ok je viens bien te croire.
    J'ai modifié mon source de façon à faire un shutdown.

    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
     
    shutdown(Sock_clt, SHUT_RDWR);
    shutdown(Sock_srv, SHUT_RDWR);
    close(Sock_clt);
    close(Sock_srv);
    ou
    shutdown(Sock_srv, SHUT_RDWR);
    shutdown(Sock_clt, SHUT_RDWR);
    close(Sock_clt);
    close(Sock_srv);
    ou
    shutdown(Sock_srv, SHUT_RDWR);
    close(Sock_clt);
    close(Sock_srv);
    ...
    Je ne vois toujours pas d'où ça vient.

  4. #4
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    est-ce que ton client détecte que la communication est coupée et du coup est-ce qu'il s'arrête ?

    C'est ce qu'il devrait faire....
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par souviron34
    est-ce que ton client détecte que la communication est coupée et du coup est-ce qu'il s'arrête ?

    C'est ce qu'il devrait faire....
    J'utilise le telnet de Linux et dés que je close la socket cliente il m'affiche "Connection closed by foreign host".

  6. #6
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    oui mais est-ce qu'il fait lui aussi close puis shutdown ?
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Je ne sais pas ce n'est pas moi qui ait écrit le client. On peut penser que les programmeurs de linux sont consciencieux et savent comment faire fonctionner un client TCP ...

  8. #8
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    oui sauf qu'en général c'est le client qui ferme. Le serveur ne ferme rien en général...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Je suis d'accord avec toi mais quand on redémarre le service MySQL par exemple, il ferme bien les clients qui sont connectés et il se relance.
    Et si on reset la socket (par contre je ne sais pas comment on fait), ça ne peut pas résoudre mon problème...

  10. #10
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    le shutdown doit se faire suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      shutdown(sockno,2);
      close(sockno);
    Est-ce ça ?
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par souviron34
    le shutdown doit se faire suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      shutdown(sockno,2);
      close(sockno);
    Est-ce ça ?
    Ca ne marche pas non plus. Ce qui me rassure c'est que je ne suis pas seul à galèrer...

  12. #12
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par sbouvet
    Ca ne marche pas non plus. Ce qui me rassure c'est que je ne suis pas seul à galèrer...
    je ne galère pas puisque je ne teste pas c'est juste d'après ce que tu dis...

    Peux-tu expliquer un peu plus ce qui se passe dans ton prog.. ?

    Qui sont les clients ?
    Comment ton "serveur" (qui n'est pas un) les contacte ?

    En gros, que veux-tu faire ??
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Si tu regardes le source fourni dans le 1er message, c'est le code de mon serveur.

    1. Création de la socket serveur
    2. Appel à bind
    3. Se met en mode listen
    4. Attend une connexion d'un client (telnet sur le port 6666)

    Lorsque la connexion est établie
    6. Envoi 20 fois "123456789\r\n" espacé de 1 seconde
    7. Ferme la connexion cliente (socket)
    8. Ferme la socket serveur

    Fin du programme serveur

  14. #14
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    ok mais il n'y a pas une instruction pour dire au client c'est fini ???????
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Bha non, le client telnet n'attend pas de message de fin de connexion.
    Le but de mon serveur est d'attendre qu'un client se connecte, lui envoyer du log temps qu'il est connecté. Maintenant si je veux relancer mon programme serveur et qu'il n'y a pas de client connecté il n'y a pas de souci. Mais si j'ai un client connecté, je souhaiterai pouvoir fermer mes sockets proprement pour ne pas avoir de problème avec "bind" au redémarrage du programme serveur.

Discussions similaires

  1. Netstat et socket
    Par alexorcet dans le forum Réseau
    Réponses: 5
    Dernier message: 02/06/2008, 15h07
  2. Réponses: 1
    Dernier message: 09/11/2006, 02h00
  3. executer une application a distance : Sockets ? RPC ? CORBA?
    Par a_hic dans le forum Développement
    Réponses: 5
    Dernier message: 30/05/2006, 13h02
  4. Socket:Envoyer du texte d'un serveur vers tout les clients
    Par cedm78 dans le forum Web & réseau
    Réponses: 7
    Dernier message: 01/08/2002, 16h40
  5. transfert d'un fichier bitmap en socket tcp
    Par localhost dans le forum C++Builder
    Réponses: 5
    Dernier message: 29/07/2002, 00h40

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