创建仅限于localhost连接的套接字

时间:2010-01-25 21:00:44

标签: python client-server

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

6 个答案:

答案 0 :(得分:6)

鉴于使用socket.socket()创建的套接字,您可以在收听之前使用bind()

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

使用地址127.0.0.1表示套接字只应绑定到本地接口。

答案 1 :(得分:5)

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

显示一些套接字示例。我觉得这个小窍子很有意思

  

我们使用了socket.gethostname(),以便外部世界可以看到套接字。如果我们使用了s.bind(('',80))或s.bind(('localhost',80))或s.bind(('127.0.0.1',80))我们仍然会有一个“服务器” “套接字,但只能在同一台机器中看到。

我猜你有答案(见下面的更正

关于使用此方法进行线程通信的有效性。我不确定它如何处理多个线程和读/写

修改

下面链接的python配方似乎进行了一些线程间的通信

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

玩得开心!

修改

该文章不正确,并指出“ s.bind(('',80))将绑定到INADDR_ANY

答案 2 :(得分: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')

答案 3 :(得分:2)

您可能希望使用标准库中的queue module。它专门用于促进线程之间的通信。来自文档的引用:

  

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

答案 4 :(得分:0)

如果你做sock.bind((端口,'127.0.0.1')),它只会在localhost上侦听,而不是在其他接口上侦听,所以这就是你所需要的。

答案 5 :(得分:0)

概念在TCP / IP网络127.0.0.0/8是不可路由的网络,因此您不能在路由基础结构上发送目标为127.0.0.1的IP数据报。路由器只会丢弃数据报。但是,可以构造和发送目标地址为127.0.0.1的数据报,因此与主机在同一网络(IP网络感)上的主机可能会将数据报送到主机的TCP / IP堆栈。这是您当地的火灾发挥作用的地方。您的本地(主机)防火墙应该有一个规则,丢弃目的地为127.0.0.0/8的IP数据报进入除lo0(或等效的环回接口)之外的任何接口。如果您的主机1)具有此类防火墙规则或2)存在于其自己的网络上(或仅与完全受信任的主机共享)并且在配置良好的路由器后面,您可以安全地绑定到127.0.0.1并且相当确定任何您在套接字上收到的数据报来自本地计算机。先前的答案解决了如何打开并绑定到127.0.0.1。