16

別のソフトウェアコンポーネントの機能をテストするためのPythonテストプログラムがあります。後者をテスト対象コンポーネント(COT)と呼びましょう。Pythonテストプログラムは、永続的なTCP接続を介してCOTに接続されます。Pythonプログラムは、このためにPythonソケットAPIを使用しています。ここで、物理リンクの障害をシミュレートするために、Pythonプログラムでソケットをシャットダウンしますが、適切に切断する必要はありません。SYNつまり、TCP //を含め、TCPチャネルで何も送信されないようにしACKますFIN。ソケットをサイレントにしたいだけです。これ以上リモートパケットに応答してはなりません。

closeソケットを呼び出すとTCPFINパケットがリモートエンドに送信されるため、これは見た目ほど簡単ではありません。(優雅な切断)。では、パケットを送信せずにソケットを強制終了するにはどうすればよいですか?

他のコンポーネントへの他の接続を維持する必要があるため、Pythonプログラム自体をシャットダウンできません。詳細については、ソケットは別のスレッドで実行されます。だから突然スレッドを殺そうと思ったのですが、これも簡単ではありません。(Pythonでスレッドを強制終了する方法はありますか?

何か案は?

4

2 に答える 2

13

カーネル内のネットワークスタックは、特定のTCP接続に関連するリソースと状態を保持しているため、ユーザーランドプロセスからこれを行うことはできません。プロセス全体を強制終了すると、カーネルはFINプロセスが持っていたファイル記述子を認識し、それらを適切にクリーンアップしようとするため、反対側にを送信します。

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

于 2012-11-19T16:56:46.213 に答える
-1

Nikolaiの答えに反して、すべての保留中のデータの後にFINではなく、RSTが送信され、保留中のデータが破棄されるように、ユーザーランドからの接続をリセットする方法が実際にあります。ただし、使用よりも悪用されているため、ここでは公開しません。そして、Pythonから実行できるかどうかはわかりません。3つの可能なSO_LINGER構成のいずれかを設定し、閉じるとそれが実行されます。それ以上は言いませんが、このテクニックは質問で概説されている目的にのみ使用されるべきであると言います。

于 2012-11-19T22:07:34.257 に答える