2010-01-25 78 views
8

我有一个Python程序有很多线程。我正在考虑创建一个套接字,将它绑定到本地主机,并让线程读/写这个中心位置。不过,我不希望此套接字对网络的其余部分开放,只应接受来自127.0.0.1的连接。我将如何做到这一点(在Python中)?这是一个合适的设计?还是有更优雅的东西?创建一个只限于本地主机连接的套接字只有

回答

0

如果你做sock.bind((port,'127.0.0.1'))它只会监听本地主机,而不是其他接口,所以这就是你所需要的。

6

考虑到与socket.socket()创建了一个插座,你可以听之前使用bind()

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

使用地址127.0.0.1表明插座应绑定到只有本地接口。

+0

这不是绑定到'INADDR_ANY'吗? – 2010-01-25 21:10:24

+0

不符合http://www.amk.ca/python/howto/sockets/,但实际的Python文档声明''''相当于'INADDR_ANY'。我会更新我的答案。 – 2010-01-25 21:12:24

+1

如果你告诉它(通过指定一个'')主机,它会绑定到INADDR_ANY。指定主机'127.0.0.1'将其绑定到127.0.0.1 – nos 2010-01-25 22:05:00

5

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

显示了一些插座例子。这个珍闻对你来说很有意思

我们使用了socket.gethostname(),以便插座对外界可见。如果我们使用s.bind(('',80))或s.bind(('localhost',80))或s.bind(('127.0.0.1',80)),我们仍然会有一个“服务器“套接字,但只在同一台机器上可见。

我想有你的答案(见下文校正

至于使用这种方法用于线程通信的有效性。我不知道如何处理这个多线程和读/写

编辑

人们似乎低于链接的蟒蛇配方做一些线程间通信

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

有乐趣!

编辑

这篇文章是不正确的,因为指出 “s.bind(( '',80))将绑定到INADDR_ANY

+1

该文章不正确。 s.bind(('',80))将绑定到INADDR_ANY。 – JimB 2010-01-25 22:28:50

+0

感谢您的支持,我将对其进行编辑 – petantik 2010-01-25 23:36:34

2

您可能希望从标准使用queue module图书馆。它专为促进线程之间的通信而设计。来自文档的报价:

队列模块实现多生产者,多用户队列。当信息必须在多个线程之间安全地交换时,它在线程编程中特别有用。此模块中的Queue类实现了所有必需的锁定语义。这取决于Python中线程支持的可用性;请参阅线程模块。

3

如果您在基于UNIX的系统上运行,则可能需要考虑使用UNIX Domain Sockets而不是Internet套接字。我觉得像下面应该工作:

>>> # 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

在环回设备上使用TCP/IP套接字具有可以通过SSH隧道访问的优点(或缺点,如果您愿意的话)。 – 2010-01-25 22:00:58

+1

UNIX域套接字提供了与文件系统绑定的相同功能。我倾向于他们,因为他们不像IP套接字那样占用资源。 – 2010-01-25 23:04:33

0

notionOn TCP/IP网络127.0.0.0/8是一种非可路由的网络,所以你不应该能够发往跨127.0.0.1 IP数据报一个路由基础设施。路由器将丢弃数据报。但是,可以构建和发送目标地址为127.0.0.1的数据报,因此与主机位于同一网络(IP网络感知)的主机可能会将数据报发送到主机的TCP/IP堆栈。这是您当地的防火墙发挥作用的地方。你的本地(主机)防火墙应该有一个规则,放弃去往除lo0之外的任何接口(或等效的回送接口)的去往127.0.0.0/8的IP数据报。如果你的主机或者1)具有这样的防火墙规则,或者2)存在于它自己的网络上(或者只与完全信任的主机共享)并且在配置良好的路由器后面,你可以安全地绑定到127.0.0.1,您在套接字上收到的数据报来自本地机器。以前的答案解决了如何打开并绑定到127.0.0.1。