我有一个Python程序有很多线程。我正在考虑创建一个套接字,将它绑定到本地主机,并让线程读/写这个中心位置。不过,我不希望此套接字对网络的其余部分开放,只应接受来自127.0.0.1
的连接。我将如何做到这一点(在Python中)?这是一个合适的设计?还是有更优雅的东西?创建一个只限于本地主机连接的套接字只有
回答
如果你做sock.bind((port,'127.0.0.1'))它只会监听本地主机,而不是其他接口,所以这就是你所需要的。
考虑到与socket.socket()
创建了一个插座,你可以听之前使用bind()
:
socket.bind(('127.0.0.1', 80))
使用地址127.0.0.1
表明插座应绑定到只有本地接口。
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”
您可能希望从标准使用queue module图书馆。它专为促进线程之间的通信而设计。来自文档的报价:
队列模块实现多生产者,多用户队列。当信息必须在多个线程之间安全地交换时,它在线程编程中特别有用。此模块中的Queue类实现了所有必需的锁定语义。这取决于Python中线程支持的可用性;请参阅线程模块。
如果您在基于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')
在环回设备上使用TCP/IP套接字具有可以通过SSH隧道访问的优点(或缺点,如果您愿意的话)。 – 2010-01-25 22:00:58
UNIX域套接字提供了与文件系统绑定的相同功能。我倾向于他们,因为他们不像IP套接字那样占用资源。 – 2010-01-25 23:04:33
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。
- 1. 如何创建只有本地主机的Java套接字?
- 2. playorm只连接到本地主机
- 3. 只有一个连接的两个套接字
- 4. tika-server v1.5只接受来自本地主机的连接
- 5. SSH:只接受来自本地主机的密码连接
- 6. 节点如何让套接字只接受本地连接?
- 7. 本地主机套接字未连接错误与虚拟机
- 8. 小应用程序无法在本地主机上创建套接字连接
- 9. 连接到本地主机上的套接字
- 10. Tomcat:限制访问本地主机的/只有一个/ webapp
- 11. 从套接字获取IP从本地主机连接到java
- 12. 创建套接字连接
- 13. 只允许来自本地主机的Redis连接?
- 14. C#的Mysql连接只能在本地主机上工作
- 15. 如何只允许来自本地主机的TCP连接
- 16. 我的聊天客户端只连接到本地主机
- 17. 只能通过本地主机连接而不能通过IP连接
- 18. C客户端只能连接到本地主机。
- 19. Winsock返回10061只连接到本地主机
- 20. 动态Web服务项目 - 只能连接在本地主机
- 21. LDAP连接只能在本地主机上工作
- 22. 套接字只接受特定地址?
- 23. VirtualBox本地主机连接
- 24. 本地主机 - 根连接
- 25. 连接到本地主机
- 26. pyftpdlib每个套接字地址只有一个用法
- 27. Web浏览器创建到本地机器的套接字连接。
- 28. 创建没有IP地址的套接字连接(TCP或UDP)
- 29. AIR本地套接字连接 - 错误#2031:套接字错误。网址:本地主机
- 30. 套接字连接只需要一个线程吗?
这不是绑定到'INADDR_ANY'吗? – 2010-01-25 21:10:24
不符合http://www.amk.ca/python/howto/sockets/,但实际的Python文档声明''''相当于'INADDR_ANY'。我会更新我的答案。 – 2010-01-25 21:12:24
如果你告诉它(通过指定一个'')主机,它会绑定到INADDR_ANY。指定主机'127.0.0.1'将其绑定到127.0.0.1 – nos 2010-01-25 22:05:00