python twisted:每个id强制执行一次连接

时间:2015-03-24 22:35:20

标签: twisted twisted.internet

我有一个使用SSL套接字的扭曲服务器,并使用证书来识别连接到服务器的不同客户端。我想强制执行每个可能的id只有一个连接的状态。我能想到的两种方法是跟踪连接的id,然后不允许第二个连接使用相同的id或允许第二个连接并立即终止第一个连接。我正在努力做到这一点,但我遇到了一些问题(我会在最后解释我的选择)

我在工厂类中存储连接列表,然后在SSL握手后,我将客户端的id与该列表进行比较。如果它已经在该列表中,我会尝试在其上调用.transport.abortConnection()。然后我想做我正常的事情来记录我的数据库中的新连接。但是,对abortConnection()的调用似乎没有直接调用connectionLost(),这是我执行清理的地方,并调用数据库来表示连接丢失。因此,我的代码然后记录了连接的ID,但稍后调用了connectionLost(),导致数据库看起来断开了该ID。

是否有某种方法可以阻止传入的第二个连接进一步处理,直到第一个连接完成处理断开连接?

选择说明:我这样做的全部原因是我在NAT后面有客户似乎在相当规律地改变他们的IP地址(每1-3天一次)。连接的设备只是将它们的连接断开,然后它们尝试重新连接新的IP。但是,我的服务器未收到有关断开连接的通知,通常必须超时连接。但是,在服务器超时之前,客户端有时会设法重新连接,然后服务器处于由同一客户端具有两个明显连接的状态。所以,通常第一个连接是我真正想要终止的连接。

1 个答案:

答案 0 :(得分:1)

确定连接的ID后,您可以在" new"上拨打self.transport.pauseProducing()。连接的传输,在您致电self.transport.resumeProducing()之前会阻止任何通知。如果存在新连接,您可以从newConnection.transport.resumeProducing()致电oldConnection.connectionLost()