Partage
  • Partager sur Facebook
  • Partager sur Twitter

A propos de la déconnexion des sockets ?

    6 octobre 2007 à 12:48:48

    Bonjour ! :)

    J'ai un petit problème avec les sockets, plus particulièrement dans ce code (les deux derniers codes) :

    il s'avère qu'il y ait un problème si le serveur se déconnecte avant le client ! (il faut attendre 1 minute avant de pouvoir "binder" la socket du serveur à nouveau)

    D'où vient mon problème ? Peut être que je ferme mal la socket du client (dans le serveur) ?
    • Partager sur Facebook
    • Partager sur Twitter
      6 octobre 2007 à 13:25:51

      man setsockopt
      option: SO_REUSEADDR

      Après la ferméture tape un petit netcat -a tu verras que le listen est toujours là, en mettant l'option SO_REUSEADDR à ta socket (dans le serveur) tu n'auras plus de problème de ce genre.
      PS: l'option est à appliquer avant l'appel à bind()
      • Partager sur Facebook
      • Partager sur Twitter
        6 octobre 2007 à 15:48:04

        Citation : Goundy

        man setsockopt
        option: SO_REUSEADDR

        Après la ferméture tape un petit netcat -a tu verras que le listen est toujours là, en mettant l'option SO_REUSEADDR à ta socket (dans le serveur) tu n'auras plus de problème de ce genre.
        PS: l'option est à appliquer avant l'appel à bind()



        Salut !

        pourrais-je avoir des précision sur netcat (je ne trouves pas d'argument -a dans les manpages)

        A quoi donc sert cette option SO_REUSEADDR ?
        (je n'ai pas tous compris : "indique que les règles de validation d'adresse utilisées dans la fonction bind(2) doivent autoriser la réutilisation des adresses locales.")


        1. int  getsockopt(int  s, int level, int optname, void *optval, socklen_t *optlen);

        • s : la socket
        • level : il semblerais que ce soit : SOL_SOCKET dans mon cas
        • optname : ?
        • optval : ?
        • optlen : ?
        • Partager sur Facebook
        • Partager sur Twitter
          6 octobre 2007 à 18:48:27

          Quand le serveur se ferme prématurément (tu fermes pas proprement ta socket).
          En fait t'es obligé d'utiliser l'option SO_REUSEADDR mais faut prévoir le cas ou ca se ferme violament!
          Bon pour fermer proprement une socket il faut passer par shutdown() et non close() directement ;)
          • Partager sur Facebook
          • Partager sur Twitter
            7 octobre 2007 à 10:14:31

            Citation : Goundy

            Bon pour fermer proprement une socket il faut passer par shutdown() et non close() directement ;)


            hum, bin, ça fait pareil si je rajoute shutdown avant close ! :euh:
            • Partager sur Facebook
            • Partager sur Twitter
              7 octobre 2007 à 14:55:37

              tu fais un shutdown(SHUT_RDWR) ?
              • Partager sur Facebook
              • Partager sur Twitter
                7 octobre 2007 à 18:09:57

                Citation : Goundy

                tu fais un shutdown(SHUT_RDWR) ?


                Oui !
                • Partager sur Facebook
                • Partager sur Twitter
                  8 octobre 2007 à 18:49:09

                  Citation : Goundy

                  montre ton code



                  Beaucoup trop gros !


                  Mais sinon, il faut faire shutdown et close à toutes les sockets ? (socket du serveur, socket du client dans le serveur, socket du client dans le client)

                  [edit]

                  Bon, j'apporte quelque petite précision :

                  Imaginons un jeu vidéo en réseau, et imaginons que je contrôle le serveur et que je veuille "kicker" un player (le faire partir du serveur) . Comment pourrait-on imaginer une fonction ?

                  1. void kickplayer(int socket)
                  2. {
                  3.         shutdown(socket, SHUT_RDWR);
                  4.         close(socket);
                  5. }


                  Est-ce juste ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    8 octobre 2007 à 22:05:39

                    Tu peut aussi tout simplement fermer le socket en lecture ou écriture ou (lecture et écriture)
                    Fonction: shutdown()
                    http://www.hmug.org/man/2/shutdown.php
                    • Partager sur Facebook
                    • Partager sur Twitter

                    A propos de la déconnexion des sockets ?

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown