2015-03-24 29 views
1

我有一個扭曲的服務器,它使用SSL套接字並使用證書來識別連接到服務器的不同客戶端。我想強制每個可能的ID只有一個連接的狀態。我能想到的兩種方式是跟蹤連接的ID,然後不允許通過相同的ID進行第二次連接,或者允許第二次連接並立即終止第一次連接。我試圖做後,但我有一些問題(我會解釋我的選擇結束)python twisted:每個id強制實施一個連接

我存儲的工廠類中的連接列表,然後在SSL握手後,我比較客戶端編號與該列表。如果它已經在該列表中,我嘗試撥打.transport.abortConnection()。然後我想做我正常的事情來記錄我的數據庫中的新連接。但是,撥打abortConnection()似乎並沒有直接呼叫connectionLost(),這是我進行清理的地方,並且調用數據庫來表示連接丟失。因此,我的代碼會記錄該連接的ID,但稍後會調用connectionLost(),導致數據庫顯示該ID已斷開連接。

是否有某種方式阻止傳入的第二個連接進一步處理,直到第一個連接完成處理斷開連接?

選擇的解釋:的全部原因,我這樣做,這是我的NAT後的出現在相當定期(一次每1-3天)正在改變他們的IP地址的客戶端。連接的設備只是將他們的連接不乾淨地切斷,然後嘗試重新連接新的IP。但是,我的服務器沒有收到關於斷開連接的通知,通常不得不超時連接。但是,在服務器超時連接之前,客戶端有時會設法重新連接,然後服務器處於由同一客戶端建立兩個明顯連接的狀態。所以,通常第一個連接是我真正想要終止的連接。

回答

1

一旦確定了連接的ID,您可以在「新」連接的傳輸上調用self.transport.pauseProducing(),這將阻止任何通知,直到您致電self.transport.resumeProducing()。如果存在新的連接,則可以從oldConnection.connectionLost()撥打newConnection.transport.resumeProducing()

+0

這將是完美的,除了我正在處理'dataReceived()'中的證書處理(由於https://twistedmatrix.com/trac/ticket/6024)。有沒有辦法在第一次調用'dataReceived()'之前處理證書?如果不是,我想我可以將這些數據放入我的緩衝區,並推遲處理,直到接收到下一個數據塊,它將在'resumeProducing'之後。 – 2015-03-25 15:45:19

+0

將數據放入緩衝區可能是現在最簡單的方法。你可以添加一個'info_callback',但這不太可能是值得的。或者你可以提交6024的評論回覆,將它合併,然後使用該回調:)。 – Glyph 2015-03-26 21:13:44

+0

我想我已經改變了它來自'info_callback'類實現,因爲我需要我的協議對象中的通用名稱。另外,我不使用該值進行驗證,我假設基於證書的身份驗證由CA正確簽名。 – 2015-03-27 13:25:24