2012-11-19 15 views
10

私は別のソフトウェアコンポーネントの機能をテストするためのPythonテストプログラムを用意しています。後者をテスト対象コンポーネント(COT)としましょう。 Pythonテストプログラムは、固定TCP接続を介してCOTに接続されています。 PythonプログラムはPythonソケットAPIを使用しています。 物理リンクの障害をシミュレートするために、私はPythonプログラムでソケットをシャットダウンしたいが、適切に切断する必要はない。 すなわち、私は何もTCPチャネルに何も送ろうとしません.SYN/ACK/FINを含みます。ソケットを静かにしたいだけです。それはもはやリモートパケットに応答してはなりません。Python:ソケットを適切に閉じることなく突然切断する方法

ソケット上のcloseを呼び出すと、リモート側にTCP FINパケットが送信されるので、これはそう簡単ではありません。 (優雅な切断)。 それでは、パケットを送信せずにソケットを強制終了できますか?

他のコンポーネントへの他の接続を維持する必要があるため、Pythonプログラム自体をシャットダウンできません。 詳細については、ソケットは別のスレッドで実行されます。だから私は突然スレッドを殺すことを考えましたが、これも簡単ではありません。 (Is there any way to kill a Thread in Python?

アイデア?

答えて

7

カーネル内のネットワークスタックは、依然として特定のTCP接続に関連するリソースと状態を保持しているため、ユーザランドプロセスからはそのことを行うことはできません。イベント全体を終了すると、カーネルはプロセスのファイルディスクリプタを知っており、それらを適切にクリーンアップしようとするので、もう一方の側にFINを送信します。

これを回避する方法の1つは、ファイアウォールソフトウェア(ローカルマシンまたは中間マシン)を使用することです。指定されたIPとポートからのすべてのパケットをドロップするようにファイアウォールに指示するスクリプトを呼び出します(もちろん、適切な管理権限が必要です)。

+0

ニコライ、ありがとう、それは私が疑ったものです。 Btw、私はRSTの代わりにFINを意味しました。質問を修正しました。 – Scrontch

+0

@Scrontchこの回答は正しくありません。 – EJP

0

ニコライの回答とは対照的に、保留中のすべてのデータの後にFINではなく、RSTが送信され、保留中のデータが破棄されるように、ユーザーランドからの接続をリセットする方法があります。しかし、それが使用されているよりも虐待されているので、ここでは公開しません。そして、私はそれがPythonからできるかどうかわかりません。可能な3つのSO_LINGER設定の1つを設定して終了します。それ以上は言いませんが、このテクニックはその質問に記載されている目的のためだけに使うべきだと私は言うでしょう。

+0

さて、豆をこぼして、男:)私が理解するところでは、「私はTCPチャネルに何も送ってほしくない」とは、「RST」も意味しません。 –

+0

@NikolaiNFetissov合意。この回答はあなたのコメントとして出てきましたが、最終的にはそれ自体が答えのようです。多分それはそうではありません。 – EJP