Ich habe ein Python-Programm mit vielen Threads. Ich dachte daran, einen Socket zu erstellen, ihn an localhost zu binden und die Threads an diesem zentralen Ort lesen/schreiben zu lassen. Ich möchte jedoch nicht, dass dieser Socket für den Rest des Netzwerks offen ist, nur Verbindungen von 127.0.0.1
sollten akzeptiert werden. Wie würde ich das (in Python) machen? Und ist das ein passendes Design? Oder gibt es etwas Eleganteres?Erstellen eines Sockets nur für lokale Host-Verbindungen
Antwort
Wenn Sie sock.bind ((Port, '127.0.0.1')) ausführen, wird nur auf localhost und nicht auf anderen Schnittstellen gehorcht, das ist alles was Sie brauchen.
Bei einer Buchse mit socket.socket()
erstellt haben, können Sie bind()
vor Hören verwenden:
socket.bind(('127.0.0.1', 80))
Verwendung der Adresse 127.0.0.1
zeigt an, dass die Buchse nur an die lokale Schnittstelle binden sollte.
http://www.amk.ca/python/howto/sockets/
Zeigt einige Buchse Beispiel. Dieser Leckerbissen ist interessant für Sie Ich denke
wir verwendeten socket.gethostname(), so dass der Sockel für die Außenwelt sichtbar wäre. Wenn wir s.bind (('', 80)) oder s.bind (('localhost', 80)) oder s.bind (('127.0.0.1', 80)) benutzt hätten, hätten wir immer noch einen "Server" "Buchse, aber eine, die nur innerhalb der gleichen Maschine sichtbar war.
Ich denke, es ist Ihre Antwort (siehe unten Korrektur)
In Bezug auf die Gültigkeit für Thread-Kommunikation der Verwendung dieser Methode. Ich bin mir nicht sicher, wie gut diese mehrere Threads und Lesen Griffe/Schreiben
EDIT
Es scheint ein Python-Rezept unten, dass hat einige inter-thread Kommunikation
http://code.activestate.com/recipes/491281/
haben verknüpft zu sein Spaß!
EDIT
Der Artikel ist falsch und wie erwähnt "s.bind (('', 80)) binden an INADDR_ANY"
Sie könnten die queue module von der Norm verwenden möchten, Bibliothek stattdessen. Es wurde speziell entwickelt, um die Kommunikation zwischen Threads zu erleichtern. Ein Angebot aus der Dokumentation:
Das Queue-Modul implementiert Multi-Producer- und Multi-Consumer-Warteschlangen. Es ist besonders nützlich in der Thread-Programmierung, wenn Informationen sicher zwischen mehreren Threads ausgetauscht werden müssen. Die Queue-Klasse in diesem Modul implementiert alle erforderlichen Sperrsemantiken. Dies hängt von der Verfügbarkeit der Thread-Unterstützung in Python ab. siehe das Threading-Modul.
Wenn Sie auf einem UNIX-basierten System arbeiten, sollten Sie anstelle von Internet-Sockets die Verwendung von UNIX Domain Sockets in Erwägung ziehen.Ich denke, so etwas wie die folgenden funktionieren soll:
>>> # in one window/shell
>>> import socket
>>> sd = socket.socket(socket.AF_UNIX)
>>> sd.bind('/path/to/my/socket')
>>> sd.listen(5)
>>> (client,addr) = sd.accept()
>>> client.recv(1024)
'hello'
>>>
>>> # in a different shell
>>> import socket
>>> sd = socket.socket(socket.AF_UNIX)
>>> sd.connect('/path/to/my/socket')
>>> sd.send('hello')
Die Verwendung eines TCP/IP-Sockels auf dem Loopback-Gerät hat den Vorteil (oder den Nachteil, wenn Sie so wollen), dass es beispielsweise über einen SSH-Tunnel zugänglich ist. –
Ein UNIX Domain Socket bietet die gleiche Funktionalität, da er an das Dateisystem gebunden ist. Ich tendiere zu ihnen, weil sie nicht so schwer wie ein IP-Sockel sind. –
notionOn TCP/IP-Netzwerke 127.0.0.0/8 ist ein nicht-routeable Netzwerk, so dass Sie nicht in der Lage sein sollten, einen IP-Datagramm schicken bestimmt über 127.0.0.1 eine geroutete Infrastruktur Der Router wird nur das Datagramm verwerfen. Es ist jedoch möglich, Datagramme mit einer Zieladresse von 127.0.0.1 zu konstruieren und zu senden, sodass ein Host im selben Netzwerk (IP-Netzwerk) wie Ihr Host das Datagramm möglicherweise an den TCP/IP-Stack Ihres Hosts senden kann. Dies ist, wo Ihre lokale Feuerstelle ins Spiel kommt. Ihre lokale (Host-) Firewall sollte eine Regel haben, die IP-Datagramme, die für 127.0.0.0/8 bestimmt sind, verwirft, die an eine andere Schnittstelle als lo0 (oder die entsprechende Loopback-Schnittstelle) kommen. Wenn Ihr Host entweder 1) solche Firewall-Regeln installiert hat oder 2) in seinem eigenen Netzwerk existiert (oder mit nur vollständig vertrauenswürdigen Hosts geteilt wird) und hinter einem gut konfigurierten Router, können Sie sicher einfach an 127.0.0.1 binden und ziemlich sicher sein Datagramme, die Sie auf dem Socket empfangen, stammen vom lokalen Computer. Die vorherigen Antworten beziehen sich auf das Öffnen und Binden an 127.0.0.1.
- 1. Beste lokale Sockets Benennung Praxis
- 2. Erstellen eines nonblocking-Sockets für WinSocks und * nix
- 3. Erstellen eines neuen TCP-Sockets - Serverseite
- 4. POSIX-Nachrichtenwarteschlangen oder Unix-Domain-Sockets für lokale IPC
- 5. Portable Python erstellen (lokale Installation) für Linux
- 6. Berks nur für lokale Entwicklung verwenden?
- 7. Festlegen des lokalen Endpunkts eines Sockets
- 8. Eclipse-Aufgaben - nur lokale Repo
- 9. Erstellen Sie eine lokale Variable in Haml nur
- 10. MySQL startet nicht: [ERROR] Fehler beim Erstellen eines Sockets für IPv4 '127.0.0.1': Fehlernummer: 13
- 11. Makefile für Boost-Sockets
- 12. Erstellen eines SSL-Sockets unter Windows, das die WinCrypt-Zertifikate für die Authentifizierung verwendet?
- 13. Javadoc für lokale Variablen?
- 14. ElasticSearch: Erlaube nur lokale Anfragen
- 15. Lokale Variablen in .Net erstellen
- 16. Disconnect und Reconnect eines verbundenen Datagramm Sockets
- 17. Python Freigeben eines Netzwerk Sockets mit Multiprocessing.Manager
- 18. Verwenden von JMeter zum Testen eines Sockets
- 19. Vergessen zum Schließen eines Server Sockets
- 20. Erstellen eines Datums für getRequestedUpdateDateWithHandler:
- 21. URI für lokale Ressourcen
- 22. Erstellen eines HashSet für Doubles
- 23. Zugriff auf lokale Intranetseite für nur 1 Benutzer verweigert
- 24. Schließen eines abhörenden TCP-Sockets in C
- 25. Wie funktioniert das Anhören eines Sockets?
- 26. Erstellen eines Fenstermanagers für Linux
- 27. Erstellen eines Formulars für HTML
- 28. Raw Sockets Privileg für normale Benutzer
- 29. Domäne AF_UNIX - warum nur lokale Dateinamen verwenden?
Verbindet das nicht mit "INADDR_ANY"? –
Nicht gemäß http://www.amk.ca/python/howto/sockets/ obwohl die tatsächliche Python-Dokumentation besagt, dass '''' äquivalent zu 'INADDR_ANY' ist. Ich werde meine Antwort aktualisieren. –
Es bindet an INADDR_ANY, wenn Sie es sagen (indem Sie einen Host von '' angeben). Das Angeben eines Hosts von '127.0.0.1' bindet ihn an 127.0.0.1 – nos