J'ai un programme Python avec de nombreux threads. Je pensais à créer une prise, à lier à Localhost et à lire / écrire dans cet emplacement central. Cependant, je ne veux pas que cette prise soit ouverte au reste du réseau, des connexions de 127.0.0.1 code> doivent être acceptées. Comment ferais-je cela (en python)? Et est-ce un design approprié? Ou y a-t-il quelque chose d'un peu plus élégant? P>
6 Réponses :
Si vous faites sock.bind ((port, '127.0.0.1')), il n'écoutera que sur localhost, et non sur d'autres interfaces, c'est tout ce dont vous avez besoin. P>
donné une prise créée avec à l'aide de l'adresse socket.socket () code>, vous pouvez utiliser
bind () code>
avant d'écouter: 127.0.0.1 code> indique que La prise doit uniquement se lier à l'interface locale. p> p>
Cela ne se lie pas à inaddr_any code>?
Pas selon AMK.ca/python/howto/sockets Bien que la documentation de Python réelle déclare que '' code> équivaut à
inaddr_any code>. Je vais mettre à jour ma réponse.
Il se lie à inaddr_any si vous le dites (en spécifiant une foule de ''). Spécification d'une hôte de '127.0.0.1' Lié à 127.0.0.1
http://www.amk.ca/python/howto/sockets/ a> p>
montre un exemple de socket. Cette Tidbit est intéressante pour vous, je pense p>
Nous avons utilisé Socket.GethostName () pour que la prise soit visible au monde extérieur. Si nous avions utilisé S.Bind (('', 80)) ou S.Bind (('localhost', 80)) ou S.Bind (('127.0.0.1', 80)) Nous aurions toujours un "serveur "Prise, mais une personne qui n'a été visible que dans la même machine. p>
blockQuote>
Je suppose qu'il y a votre réponse ( voir ci-dessous pour la correction em>) p>
quant à la validité de l'utilisation de cette méthode pour les communications de fil. Je ne sais pas dans quelle mesure cela gère plusieurs threads et lecture / écriture p>
Modifier P>
Il semble y avoir une recette Python liée ci-dessous qui fait une communication inter-thread p>
http://code.activestate.com/recipes/491281/ p>
amusez-vous! p>
Modifier P>
L'article est incorrect et comme indiqué " s.bind ((" ", 80)) se liera à inaddr_any fort>" p>
Cet article est incorrect. S.Bind (('' ', 80)) va se lier à inaddr_any.
Vous voudrez peut-être utiliser le Module de file d'attente de la bibliothèque standard. Il est conçu spécifiquement pour faciliter la communication entre les threads. Une citation des docs: p>
Le module de file d'attente implémente plusieurs producteurs, files d'attente multi-consommateurs. Il est particulièrement utile dans la programmation filetée lorsque les informations doivent être échangées en toute sécurité entre plusieurs threads. La classe d'attente de ce module implémente toutes les sémantiques de verrouillage requises. Cela dépend de la disponibilité du support de fil en python; Voir le module de threading. P> blockQuote>
Si vous exécutez sur un système basé sur UNIX, vous voudrez peut-être envisager d'utiliser Domaine UNIX < / a> au lieu de prises Internet. Je pense que quelque chose comme ce qui suit devrait fonctionner:
L'utilisation d'une prise TCP / IP sur le périphérique de bouclage présente l'avantage (ou l'inconvénient, si vous le souhaitez) que cela pourrait être accessible via un tunnel SSH par exemple.
Une prise de domaine UNIX offre la même fonctionnalité car elle est liée au système de fichiers. J'ai tendance à leur égard parce qu'ils ne sont pas aussi lourds qu'une prise IP.
NOTITIONON TCP / IP Networks 127.0.0.0.0/8 est un réseau non routier. Vous ne devez donc pas être en mesure d'envoyer un datagramme IP destiné à 127.0.0.1 sur une infrastructure acheminée. Le routeur jetera simplement le datagramme. Cependant, il est possible de construire et d'envoyer des datagrammes avec une adresse de destination de 127.0.0.1, donc un hôte sur le même réseau (IP Sens of Network) que votre hôte pourrait éventuellement obtenir le datagramme à la pile TCP / IP de votre hôte. C'est là que votre parewal local entre en jeu. Votre pare-feu local (hôte) doit avoir une règle qui élimine les datagrammes IP destinés à 127.0.0.0/8 entrant dans n'importe quelle interface autre que LO0 (ou l'interface de bouclage équivalente). Si votre hôte soit 1) a de telles règles de pare-feu en place ou 2) existe sur son propre réseau (ou partagé avec uniquement des hôtes entièrement approuvés) et derrière un routeur bien configuré, vous pouvez simplement vous attaquer à 127.0.0.1 et être assez certain tout Les datagrammes que vous recevez sur la prise provenaient de la machine locale. Les réponses antérieures traitent comment ouvrir et se lier à 127.0.0.1. P>