Twisted TCP客户端中远程对等体的IP地址和主机名

1 投票
2 回答
2920 浏览
提问于 2025-04-16 14:16

我正在写一个使用Twisted Words的Jabber客户端。我想知道远程对方的IP地址和主机名。xmlstream.transport.getPeer().host 返回的是主机名,但我希望它能返回IP地址(xmlstreamtwisted.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在评论中已经提到过大部分内容,但我觉得这应该作为一个回答出现。)

撰写回答