Einen Socket erstellen, der nur auf Verbindungen mit lokalen Hosts beschränkt ist

8

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 bleibt, 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 Elegantes?

    
Dr. Johnson 25.01.2010, 21:00
quelle

6 Antworten

6

Wenn Sie einen mit socket.socket() erstellten Socket verwenden, können Sie bind() verwenden vor dem Hören:

%Vor%

Die Verwendung der Adresse 127.0.0.1 zeigt an, dass der Socket nur an die lokale Schnittstelle gebunden sein sollte.

    
Greg Hewgill 25.01.2010 21:07
quelle
5

Ссылка

Zeigt einige Socket-Beispiele. Dieser Leckerbissen ist für dich interessant, denke ich

  

Wir haben socket.gethostname () verwendet, damit der Socket für die Außenwelt sichtbar ist. 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, da ist Ihre Antwort ( siehe unten zur Korrektur )

Zur Gültigkeit dieser Methode für die Thread-Kommunikation. Ich bin mir nicht sicher, wie gut das mehrere Threads behandelt und lesen / schreiben

BEARBEITEN

Es scheint ein Python-Rezept zu geben, das unten verlinkt ist und eine Kommunikation zwischen den Threads durchführt

Ссылка

Viel Spaß!

BEARBEITEN

Der Artikel ist falsch und wie angegeben " s.bind (('', 80)) bindet an INADDR_ANY "

    
petantik 25.01.2010 21:08
quelle
3

Wenn Sie auf einem UNIX-basierten System arbeiten, sollten Sie UNIX Domain Sockets anstelle von Internet verwenden Steckdosen. Ich denke, etwas wie das Folgende sollte funktionieren:

%Vor%     
D.Shawley 25.01.2010 21:24
quelle
2

Sie können stattdessen das Warteschlangenmodul aus der Standardbibliothek verwenden. Es wurde speziell entwickelt, um die Kommunikation zwischen Threads zu erleichtern. Ein Zitat aus der Dokumentation:

  

Das Warteschlangenmodul 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.

    
Michał Marczyk 25.01.2010 21:20
quelle
0

notionOn TCP / IP-Netzwerke 127.0.0.0/8 ist ein nicht routbares Netzwerk. Sie sollten daher kein IP-Datagramm für eine geroutete Infrastruktur an 127.0.0.1 senden können. 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.

    
Dom Brezinski 25.01.2010 21:53
quelle
0

Wenn du sock.bind ((Port, '127.0.0.1')) tust, hört es nur auf localhost und nicht auf anderen Schnittstellen. Das ist alles was du brauchst.

    
nos 25.01.2010 21:06
quelle

Tags und Links