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