2012-11-19 117 views
10

我有一個用於測試另一個軟件組件的功能的Python測試程序,我們稱後者爲被測組件(COT)。 Python測試程序通過持久的TCP連接連接到COT。 Python程序正在爲此使用Python套接字API。 現在爲了模擬物理鏈接的故障,我希望Python程序關閉套接字,但不能正確斷開連接。 也就是說我不想再在TCP通道上發送任何內容,包括任何TCP SYN/ACK/FIN。我只想讓套接字靜音。它不能再響應遠程數據包。Python:如何突然斷開套接字而沒有正確關閉套接字

這並不像看起來那麼容易,因爲在套接字上調用close會將TCP FIN數據包發送到遠程端。 (優雅斷開)。 那麼我怎樣才能殺死套接字而不發送任何數據包呢?

我無法關閉Python程序本身,因爲它需要維護與其他組件的其他連接。 有關信息,套接字在單獨的線程中運行。所以我想到突然殺死線程,但這也不是那麼容易。 (Is there any way to kill a Thread in Python?

任何想法?

回答

7

由於在內核網絡堆棧仍然保存與給定TCP連接相關的資源和狀態,因此無法從用戶態進程執行此操作。事件如果你殺了你的整個進程,內核將發送一個FIN到另一側,因爲它知道你的進程有什麼文件描述符,並會嘗試正確地清理它們。

解決此問題的一種方法是啓動防火牆軟件(在本地或中間機器上)。調用一個腳本,告訴防火牆將所有數據包從給定的IP和端口中刪除(當然這需要適當的管理權限)。

+0

尼古拉,謝謝,這就是我懷疑的。順便說一句,我的意思是FIN而不是RST。更正了這個問題。 – Scrontch

+0

@Scrontch這個答案不正確。 – EJP

0

與尼古拉的答案相反,確實有一種方法可以重置來自userland的連接,以便發送RST並掛起數據丟棄,而不是在所有未決數據之後發出FIN。然而,由於它比濫用更加濫用,我不會在這裏發佈它。我不知道它是否可以從Python完成。設置三種可能的SO_LINGER配置中的一種並關閉就可以了。我不會多說,我會說這種技術只能用於問題中概述的目的。

+0

那麼,泄漏豆類,男人:)順便說一句,據我所知,「我不想再發送任何東西在TCP通道上」也意味着沒有'RST'。 –

+0

@NikolaiNFetissov同意。這個答案是作爲對你的評論開始的,但最後它似乎更多地是一個答案。也許它不是。 – EJP