问题
I have a twisted server using SSL sockets and using certificates to identify the different clients that connect to the server. I'd like to enforce the state where there is only one connection by each possible id. The two ways I can think of is to keep track of connected ids and then not allow a second connection by the same id or allow the second connection and immediately terminate the first. I'm trying to do the later but am having some issues (I'll explain my choice at the end)
I'm storing a list of connections in the factory class and then after the SSL handshake I compare the client's id with that list. If it's already in that list I try to call .transport.abortConnection()
on it. I then want to do the normal things I do to record the new connection in my database. However, the call to abortConnection()
doesn't seem to call connectionLost()
directly which is where I do my cleanup and calls to the database to say that a connection was lost. So, my code then records that the id connected but later a call is made to connectionLost()
resulting in the database appearing to have that id disconnected.
Is there some sort of way to block the incoming second connection from further processing until the first connection has finished processing the disconnection?
Choice explanation: The whole reason I'm doing this is I have clients behind NATs that appear to be changing their IP address on a fairly regular basis (once a every 1-3 days). The devices connecting will just have their connections uncleanly severed and then they try to reconnect with the new IP. However, my server isn't notified about the disconnect and usually has to timeout the connection. Before the server times out the connection, though, the client sometimes manages to reconnect and the server then is in a state with two apparent connections by the same client. So, typically the first connection is the one I really want to terminate.
回答1:
Once you have determined the ID of the connection, you can call self.transport.pauseProducing()
on the "new" connection's transport, which will prevent any notifications until you call self.transport.resumeProducing()
. You can then call newConnection.transport.resumeProducing()
from oldConnection.connectionLost()
, if a new connection exists.
来源:https://stackoverflow.com/questions/29244156/python-twisted-enforcing-a-single-connection-per-id