2010-01-25 16 views
8

Tengo un programa de python con muchos subprocesos. Estaba pensando en crear un socket, vincularlo a localhost y hacer que los hilos se lean/escriban en esta ubicación central. Sin embargo, no quiero que este socket se abra al resto de la red, solo se deben aceptar las conexiones desde 127.0.0.1. ¿Cómo haría esto (en Python)? Y este es un diseño adecuado? ¿O hay algo un poco más elegante?Crear un socket restringido a las conexiones de localhost solo

Respuesta

0

Si usa sock.bind ((puerto, '127.0.0.1')) solo escuchará en localhost, y no en otras interfaces, así que eso es todo lo que necesita.

6

Dado un socket creado con socket.socket(), puede utilizar bind() antes de escuchar:

socket.bind(('127.0.0.1', 80)) 

Utilizando la dirección 127.0.0.1 indica que la toma debe unirse solamente a la interfaz local.

+0

¿Esto no se relaciona con 'INADDR_ANY'? –

+0

No de acuerdo con http://www.amk.ca/python/howto/sockets/ aunque la documentación real de Python indica que '''' es equivalente a 'INADDR_ANY'. Actualizaré mi respuesta. –

+1

Se une a INADDR_ANY si se lo indica (especificando un host de ''). Especificar un host de '127.0.0.1' lo vincula a 127.0.0.1 – nos

5

http://www.amk.ca/python/howto/sockets/

muestra algunos ejemplo zócalo. Este tidbit es interesante para ti creo que

usamos socket.gethostname() para que el socket fuera visible para el mundo exterior. Si hubiéramos usado s.bind (('', 80)) o s.bind (('localhost', 80)) o s.bind (('127.0.0.1', 80)) todavía tendríamos un "servidor" "socket, pero uno que solo era visible dentro de la misma máquina.

supongo que es su respuesta (ver más abajo para la corrección)

En cuanto a la validez del uso de este método para las comunicaciones de rosca. No estoy seguro de lo bien que maneja múltiples hilos y lectura/escritura

EDITAR

Parece que hay una receta pitón vinculada a continuación que hace algún tipo de comunicación entre hilos

http://code.activestate.com/recipes/491281/

Tener ¡divertido!

EDITAR

El artículo es incorrecto y como se ha señalado "s.bind (('', 80)) se unirá a INADDR_ANY"

+1

Ese artículo es incorrecto. s.bind (('', 80)) se vinculará a INADDR_ANY. – JimB

+0

Gracias por eso voy a editar para reflejar – petantik

2

Es posible que desee utilizar el queue module de la norma biblioteca en su lugar. Está diseñado específicamente para facilitar la comunicación entre hilos. Una cita de los documentos:

El módulo Queue implementa colas de múltiples productores y consumidores múltiples. Es especialmente útil en la programación con hilos cuando la información debe intercambiarse de forma segura entre múltiples hilos. La clase Queue en este módulo implementa todas las semánticas de bloqueo requeridas. Depende de la disponibilidad del soporte de subprocesos en Python; ver el módulo de roscado.

3

Si está ejecutando en un sistema basado en UNIX, es posible que desee considerar el uso de UNIX Domain Sockets en lugar de tomas de Internet.Creo que algo como lo siguiente debería funcionar:

>>> # 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') 
+0

El uso de una toma TCP/IP en el dispositivo de retroalimentación tiene la ventaja (o desventaja, si se quiere) de que se podría acceder a través de un túnel SSH, por ejemplo. –

+1

Un socket de dominio UNIX ofrece la misma funcionalidad ya que está unido al sistema de archivos. Me inclino por ellos porque no son tan pesados ​​como un conector IP. –

0

redes notionOn TCP/IP 127.0.0.0/8 es una red no routeable, lo que no debería ser capaz de enviar un datagrama IP destinado a 127.0.0.1 a través una infraestructura enrutada El enrutador simplemente descartará el datagrama. Sin embargo, es posible construir y enviar datagramas con una dirección de destino de 127.0.0.1, de modo que un host en la misma red (sentido de red IP) que su host podría obtener el datagrama en la pila TCP/IP de su host. Aquí es donde entra en juego tu firewal local. Su cortafuegos local (host) debe tener una regla que descarte los datagramas IP destinados a 127.0.0.0/8 que entren en cualquier interfaz que no sea lo0 (o la interfaz loopback equivalente). Si su host 1) tiene tales reglas de firewall en su lugar o 2) existe en su propia red (o compartido solo con hosts completamente confiables) y detrás de un enrutador bien configurado, puede vincularse de forma segura a 127.0.0.1 y estar seguro de cualquier los datagramas que recibe en el socket provienen de la máquina local. Las respuestas anteriores abordan cómo abrir y enlazar a 127.0.0.1.

Cuestiones relacionadas