接続タイムアウトエラーを人為的に作成する
接続タイムアウトが発生したときに発生するソフトウェアのバグがありました。これらのエラーは非常にまれです(通常、内部ネットワークによって接続が切断される場合)。この種の効果を人工的に生成して、ソフトウェアをテストするにはどうすればよいですか?
問題があれば、アプリはCAsyncSocketクラスを使用してC++/MFCで記述されます。
編集:
存在しないホストを使用しようとしましたが、ソケットエラーが発生しました。
WSAEINVAL(10022)無効な引数
私の次の試みは、 Alexander の異なるポートへの接続の提案を使用することでした。 81(ただし、自分のサーバー上)。うまくいきました。切断された接続とまったく同じ(60秒待機してからエラー)。ありがとうございました!
既存のホストに接続しますが、TCP SYNパケットを単にドロップするファイアウォールによってブロックされているポートに接続します。たとえば、www.google.com:81。
10.255.255.1などのルーティング不可能なIPアドレスに接続します。
UNIXマシンを使用している場合は、netcatを使用してポートリッスンを開始できます。
nc -l 8099
次に、サービスを変更して、そのポートに対して通常行うことを呼び出すようにします。 http:// localhost:8099/some/sort/of/endpoint
次に、サービスは接続を開いてデータを書き込みますが、応答を受け取ることはないため、(接続拒否ではなく)読み取りタイムアウトが発生します
Python REPLを使用して、データの受信中(つまり、接続が正常に確立された後)のタイムアウトをシミュレートできます。標準のPythonインストールだけが必要です。
Python 2.7.4 (default, Apr 6 2013, 19:54:46) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import socket
>>> s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
>>> s.bind(('localhost', 9000))
>>> s.listen(0)
>>> (clientsocket, address) = s.accept()
これで、着信接続を待機します。テストするものはすべてlocalhost:9000
に接続します。実行すると、Pythonは接続を受け入れ、accept()
は接続を返します。 clientsocket
を介してデータを送信しない限り、呼び出し元のソケットは次のrecv()
の間にタイムアウトするはずです。
- 10.0.0.0
- 10.255.255.255
- 172.16.0.0
- 172.31.255.255
- 192.168.0.0
- 192.168.255.255
これらはすべてルーティング不可能です。
pathod に皆の注意を向けたい
(例から取られた)200:b@100:dr
の構成を使用すると、ランダムにドロップする接続が得られます。
ソフトウェアソリューションはどうですか。
アプリケーションサーバーにSSHサーバーをインストールします。次に、ソケットトンネルを使用して、アプリケーションサーバー上のローカルポートとリモートポートの間にリンクを作成します。これを行うには、sshクライアントツールを使用できます。代わりに、クライアントアプリケーションをマップされたローカルポートに接続してください。次に、ソケットトンネルを自由に切断して、接続タイムアウトをシミュレートできます。
アクティブな接続を使用する場合は、 http://httpbin.org/delay/# を使用することもできます。#は、サーバーが応答を送信するまで待機する時間です。タイムアウトが遅延より短い限り、...は効果をシミュレートします。 pythonリクエストパッケージで正常に使用しました。
機密性の高いものを送信する場合は、リクエストを変更する必要があります。送信されたデータがどうなるかわかりません。
サーバーが応答するまでにかかる時間を指定するAPIを呼び出すことにより、Originタイムアウトを人為的に作成できるサービスがあります。 macgyverのサーバータイムアウトはそのようなサービスの例です。
たとえば、応答に15秒かかるリクエストをテストする場合は、macgyver APIにポストリクエストを行うだけです。
JSONペイロード:
{
"timeout_length": 15000
}
APIレスポンス(15秒後):
{
"response": "ok"
}
Macgyverのサーバータイムアウトプログラム
https://askmacgyver.com/explore/program/server-timeout/3U4s6g6
別のインターフェイスを作成するMicrosoft Loopbackドライバーをインストールする場合があります。その後、それを自分のサービス(自分のホスト)に接続できます。次に、ネットワーク接続で、このようなインターフェイスを無効/有効にすることができます...
たくさんの良い答えがありますが、最もクリーンなソリューションは このサービス
http://httpstat.us/504?sleep=60000
タイムアウト期間(最大230秒)および最終的な戻りコードを構成できます。
ランダム接続タイムアウトをシミュレートするために頻繁に使用する手法は、sshローカルポート転送を使用することです。
ssh -L 12345:realserver.com:80 localhost
これにより、localhost:12345のトラフィックがrealserver.com:80に転送されます。必要に応じて、ローカルマシンでもこれをループできます。
ssh -L 12345:localhost:8080 localhost
したがって、アプリケーションをローカルホストとカスタムポートに向けると、トラフィックはターゲットのHost:portにルーティングされます。次に、このシェルを終了できます(終了後にシェルをctrl + cする必要がある場合があります)。これにより、転送が強制終了され、アプリで接続が失われます。
OPがどちらをテストするかは完全には明確ではありませんが、存在しないホスト/ポートへの接続試行と、既に確立された接続のタイムアウトとの間には違いがあります。ロブと一緒に行き、接続が機能するまで待ってからケーブルを引きます。または-利便性のために、仮想マシンをテストサーバーとして(ブリッジネットワークを使用して)動作させ、接続が確立されたら仮想ネットワークインターフェイスを非アクティブにします。
私はあなたと同じ線に沿って問題がありました。ソフトウェアの動作をテストするために、適切なタイミングでネットワークケーブルを抜きました。ケーブルを抜く直前にブレークポイントを設定する必要がありました。
もう一度やる場合は、ネットワークケーブルにスイッチ(通常は閉じている瞬間的なプッシュボタン)を入れます。
物理的な切断によって別の動作が発生する場合は、コンピューターを安価なハブに接続し、上記のスイッチをハブとメインネットワークの間に配置できます。
-編集-多くの場合、プログラムの特定のポイントに到達するまでネットワーク接続が動作する必要があります。その後、提供されている多くの提案のいずれかを使用して切断する必要があります。
最も簡単な方法は、 CurrPorts を使用して接続をドロップすることです。
ただし、例外処理コードを単体テストするには、おそらくネットワーク接続コードを抽象化し、要求に応じて例外をスローするスタブ、モック、またはデコレータを作成することを検討する必要があります。その後、実際にネットワークを使用することなく、アプリケーションのエラー処理ロジックをテストできます。
私にとって最も簡単な方法は、宛先ネットワークに基づいてオフィスのルーターに静的ルートを追加することでした。トラフィックを応答しないホスト(コンピューターなど)にルーティングするだけで、リクエストのタイムアウトが発生します。
私にとって最高のことは、静的ルートをWebインターフェースで管理し、簡単に有効化/無効化できることです。
他の接続/ケーブルがないスイッチにネットワークケーブルを差し込みます。それは私見で動作するはずです。
ネットワークの問題をシミュレートするために過去に使用した戦術がいくつかあります。
- ネットワークケーブルを引き出す
- マシンと「ターゲット」マシンの間のスイッチをオフにします(理想的には、コンピュータが接続されているスイッチで電源を入れたままにして、マシンが「ネットワーク接続」を維持するようにします)
- サイレントモードで受信データをドロップするターゲットマシンでファイアウォールソフトウェアを実行する
これらのアイデアの1つは、必要なシナリオを人工的に生成する手段を提供する可能性があります
インストール/使用可能なファイアウォールソフトウェアに応じて、発信ポートをブロックでき、ファイアウォールの設定方法に応じて、接続要求パケットをドロップするだけです。接続要求なし、接続なし、タイムアウトが発生します。これはおそらく、ルーターレベルで実装された場合(リセットを送信する代わりにパケットをドロップする傾向があるか、状況に応じて同等のものであれば)うまく機能しますが、このトリックを行うソフトウェアパッケージもあるはずです。