如何在Twisted中在连接丢失后获取客户端IP地址

4

我知道我们可以在连接建立后获取客户端(主机)IP,因为此时我们将拥有传输属性:

self.transport.getPeer()

但是当Twisted TCP服务器失去与客户端的连接时,如何获取客户端的IP地址呢?即在客户端断开连接后。


难道你不能在连接期间存储它作为属性,然后稍后再读取吗? - Jakob Bowyer
2个回答

11

现在已经有点晚了。我建议您在拥有这些信息时保存它。例如:

class YourProtocol(protocol.Protocol):

    def connectionMade(self):
        self._peer = self.transport.getPeer()

    def connectionLost(self):
        print 'Lost connection from', self._peer

谢谢你的回答。你确定我们不能在连接丢失时获取时间吗? - neotam
好的,我第一次说错了。实际上,在connectionLost()回调中,self.transport.getPeer()调用对我来说很有效。我已经针对TCP连接进行了测试。我还可以从实现中看到,在DatagramProtocol子类(即UDP)的情况下,您将没有self.protocol属性。这是您的情况吗? - Marek Kowalski
exceptions.TypeError: connectionLost() 接受的参数数量应为1个,但实际给出了2个。 - Hardik Gajjar

2

虽然这个问题已经有了答案,但我想快速地添加我的答案,以便将来不会忘记...正如我们所知道的,Twisted的文档...嗯,有点复杂...

def connectionLost(self):
    ip, port = self.transport.client
    print ip
    print port

通过使用上述方法,你可以将IP/端口与你所用的客户端跟踪数据库或其他手段进行匹配。
我最终发现,通过使用print vars(self.transport) 并在输出/控制台中查看客户端对象,可以使用经典的PHP调试技巧。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接