Partage
  • Partager sur Facebook
  • Partager sur Twitter

2 serveurs sur le même port

    1 août 2023 à 15:32:53

    Bonjour à tous,

    J'ai une serveur http pour ipv4 et un autre pour ipv6, l'un fonctionne sur le port 8080 et l'autre sur le port 8888.

    Est-t 'il possible de les faire tourner sur le même port ? Si oui comment faire ?

    Voici une partie du code pour représenter mon problème

    class HTTPServerV6(HTTPServer):
      address_family = socket.AF_INET6
    
    class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
        pass
    
    
    def run(handler_class=RequestHandler):
        logging.basicConfig(level=logging.INFO)
        cam.start()
    
        # Créer le serveur IPv6
        server_v6 = HTTPServerV6(('::', 8080), handler_class)
        server_v6.socket = ssl.wrap_socket(server_v6.socket, keyfile='/usr/local/etc/cert/privkey.pem', certfile='/usr/local/etc/cert/fullchain.pem', server_side=True, ssl_version=ssl.PROTOCOL_TLS)
    
        # Créer le serveur IPv4
        server_v4 = ThreadedHTTPServer(('', 8080), handler_class)
        server_v4.socket = ssl.wrap_socket(server_v4.socket, keyfile='/usr/local/etc/cert/privkey.pem', certfile='/usr/local/etc/cert/fullchain.pem', server_side=True, ssl_version=ssl.PROTOCOL_TLS)
    
        # Démarrer les serveurs dans des threads séparés
        thread_v6 = threading.Thread(target=server_v6.serve_forever)
        thread_v4 = threading.Thread(target=server_v4.serve_forever)
        thread_v6.daemon = True  # Terminer le thread lorsque le programme principal se termine
        thread_v4.daemon = True
        thread_v6.start()
        thread_v4.start()
    
        logging.info('Starting httpd...\n')
    
        try:
            # Attendre indéfiniment ici ou effectuer d'autres opérations
            while True:
                pass
        except KeyboardInterrupt:
            pass
    
        # Fermer les serveurs
        server_v6.shutdown()
        server_v6.server_close()
        server_v4.shutdown()
        server_v4.server_close()
    
        logging.info('Stopping httpd...\n')



    • Partager sur Facebook
    • Partager sur Twitter
      1 août 2023 à 16:59:06

      Vous avez 2 ports 8080 et 8888. Chaque serveur doit gérer les clients qui se connectent sur son port. Si vous utilisez des threads, ça ne devrait pas poser problème (sinon lequel?). Par contre, démarrer 2 serveurs qui écoutent le même port devrait planter (avec le message d'erreur qui dit en gros: port already in use).

      -
      Edité par mps 1 août 2023 à 17:00:52

      • Partager sur Facebook
      • Partager sur Twitter
        2 août 2023 à 10:18:14

        mps a écrit:

        Vous avez 2 ports 8080 et 8888. Chaque serveur doit gérer les clients qui se connectent sur son port. Si vous utilisez des threads, ça ne devrait pas poser problème (sinon lequel?). Par contre, démarrer 2 serveurs qui écoutent le même port devrait planter (avec le message d'erreur qui dit en gros: port already in use).

        -
        Edité par mps il y a environ 17 heures


        Tout à fait ! J'ai effectivement cette erreur avec les ports (ce qui est logique)... Justement je me demandais si il y avait pas une façon de faire combiner ces deux fonctionnalités (c'est à dire un serveur qui accepte l'IPV6 et l'IPV4) sur un même serveur... car je ne peux utiliser qu'un port dans mon application.
        • Partager sur Facebook
        • Partager sur Twitter
          2 août 2023 à 13:42:11

          oui mais il faut configurer les sockets de façon ad hoc - via socket.create_server(...,dualstack_ipv6=True) - puis les passer aux HTTPServer (ou sous classer le code d'HTTPserver pour que...)

          -
          Edité par mps 2 août 2023 à 13:43:14

          • Partager sur Facebook
          • Partager sur Twitter
            2 août 2023 à 15:21:54

            Pour être honnête je ne vois pas du tout comment faire... :(
            • Partager sur Facebook
            • Partager sur Twitter
              2 août 2023 à 15:50:07

              Etudier les sources pour voir ce qu'on peut faire (sans tout ré-écrire) et/ou chercher sur Internet si quelqu'un n'a pas déjà codé ça. Il y a du boulot... mais techniquement ça semble faisable.
              • Partager sur Facebook
              • Partager sur Twitter
                10 août 2023 à 9:17:30

                Alors sinon il est bien possible (à l'aide du flag SO_REUSEPORT) de binder plusieurs serveurs TCP sur un même port, mais je ne pense pas que tu puisses ensuite choisir vers quel serveur sera associé une nouvelle connexion client.

                • Partager sur Facebook
                • Partager sur Twitter

                2 serveurs sur le même port

                × 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