Twisted TCP客户端中远程对等体的IP地址和主机名
我正在写一个使用Twisted Words的Jabber客户端。我想知道远程对方的IP地址和主机名。xmlstream.transport.getPeer().host
返回的是主机名,但我希望它能返回IP地址(xmlstream
是 twisted.words.protocols.jabber.xmlstream.XmlStream
的一个实例)。
更新:是的,我的Twisted版本有点旧,是从Ubuntu Hardy的包里来的:
$ python -c "import twisted; print twisted.__version__"
2.5.0
2 个回答
1
好的,我来回答我自己的问题。为了获取IP地址,我不得不直接去查看底层的socket:
ip, port = self.xmlstream.transport.socket.getpeername()
这可能是Twisted TCP客户端的一个bug,因为getPeer这个方法没有正常工作。
我用getPeer()来获取主机名。是的,这样做不好——我在依赖一个旧的、存在问题的行为。请教教我——在Twisted的新版本中,应该怎么正确做呢?
6
你遇到了一个在三年前就修复的bug,出现在Twisted 8.2.0版本中。建议你升级到更新的Twisted版本。(我推荐最近发布的Twisted 11.0的预发布版本;现在正是测试的好时机!)如果你在更新版本的Twisted中发现了这个bug,应该重新提交这个bug,并说明如何复现它!
如果你需要支持你正在使用的旧版本Twisted,而不是使用socket
,因为它是你ITransport
实现中意外暴露的细节,你应该使用getHandle
,这是获取这些依赖实现的东西的至少是文档化的、公开的方法,像这样:
self.xmlstream.transport.getHandle().getpeername()
请注意,这在某些反应器上可能无法工作,特别是IOCP反应器,它使用了不同于BSD套接字的东西进行网络通信。
(Jean-Paul在评论中已经提到过大部分内容,但我觉得这应该作为一个回答出现。)