我正在使用本地网络上的日志记录实用程序将日志数据从一个python脚本获取到另一个python脚本。服务器和客户端脚本在同一台计算机上运行,但不能在其他计算机上运行。
客户端脚本代码段,在IP" 192.168.1.9"上运行为 -
import logging, logging.handlers
rootLogger = logging.getLogger('')
rootLogger.setLevel(logging.DEBUG)
socketHandler = logging.handlers.SocketHandler('192.168.1.10', 50005)
服务器脚本代码段,在IP" 192.168.1.10"上运行本地是 -
def __init__(self, host='localhost', port=50005, handler=LogRecordStreamHandler):
socketserver.ThreadingTCPServer.__init__(self, (host, port), handler)
当我运行它时,客户端和服务器都没有响应,就像没有发送任何消息一样。
我的iptables是空的(默认),除了网络上两台机器之间的简单切换外什么都没有。我可以远程使用MySQL就好了。即使是随机开放端口的基本TCP套接字连接也能正常工作。那么这里可能出现什么问题?它与上面的记录器代码有关,还是可能是完全不同的网络原因?
答案 0 :(得分:0)
构建socketserver.TCPServer
时,(host, port)
最终会传递给socket.socket.bind
。
Socket Programming HOWTO解释了这意味着什么,但简短的版本是指定主机的目的是告诉监听器套接字要监听哪个接口。它将名称解析为一个地址,询问您的操作系统哪个接口拥有该地址,并仅侦听该接口。
我在这里使用我的Macintosh作为例子,但除了名称上的一些细微差别之外,其他地方的细节几乎相同。
'localhost'
解析为'127.0.0.1'
,它属于名为'lo0'
的接口," loopback" interface,它只侦听来自localhost地址上同一台机器的连接。
'192.168.1.10'
属于名为'en0'
的接口,这是一个以太网适配器,可以监听通过以太网端口发送的所有内容。那么,这就是为什么它适合你。但它仍然不是你(可能)想要的。
'0.0.0.0'
是属于每个接口的特殊地址。所以这可能就是你想要的。
但请注意,指定IPv4地址 - 甚至'0.0.0.0'
- 至少在某些平台上意味着您只会侦听IPv4连接。如果你也想处理IPv6,你怎么做?好吧,你不能在所有平台上做到这一点,但是对于你可以做到的那些,它只是''
。
(在某些平台上,仍然无法为IPv6工作;您需要实际创建IPv6和IPv4套接字,并将它们分别绑定到特定的IPv6和IPv4"任何"地址。但是在这样的平台上,Python仍允许你对{"任何"地址使用''
,而默认套接字将是IPv4,因此工作案例场景,就像{{1}一样}。)
所以,很有可能,你只想要:
'0.0.0.0'