接続タイムアウトエラーを人工的に作成する


291

接続タイムアウトを受信したときに発生するソフトウェアのバグがありました。これらのエラーは非常にまれです(通常、内部ネットワークによって接続が切断された場合)。この種の効果を人工的に生成してソフトウェアをテストするにはどうすればよいですか?

それが重要な場合、アプリはCAsyncSocketクラスを使用してC ++ / MFCで記述されます。

編集:

存在しないホストを使用しようとすると、ソケットエラーが発生します。

WSAEINVAL(10022)無効な引数

私の次の試みは、別のポート、たとえば81(自分のサーバーでも)に接続するというアレクサンダーの提案を使用することでした。それはうまくいきました。ドロップされた接続とまったく同じです(60秒待ってからエラー)。ありがとうございました!


こんにちはマーク、私はあなたのために働く解決策を試しました、しかし私が受け取っているものは#503(サービス利用不可です)です。#504(ゲートウェイタイムアウト)、#599(ネットワーク接続タイムアウトエラー)、#598(ネットワーク読み取りタイムアウトエラー)のいずれかである必要はありません。
CoDe

回答:


297

既存のホストに接続しますが、TCP SYNパケットを単にドロップするファイアウォールによってブロックされているポートに接続します。たとえば、www.google.com:81です。


6
この答えは単純で、以下の@emuの答えと同じように機能します。この回答がgoogle.com:81の使用を意図したものではないことを理解していますが、ここでのポイントは、ブロックされている別のポートを使用することです。したがって、常に<your-own-ip>:<blocked-port>を使用できます。
James Selvakumar、2014

6
自分のサーバーでない限り、テストのために他のサーバーを攻撃するのは失礼です。10.255.255.1のようなルーティング不可能なIPアドレスにアクセスして、下記のエミュのような文明的なソリューションを使用するか、テスト用に独自の仮想サーバーをセットアップします。
Zeeshan

2
Googleがこのポートをブロックした可能性があると思います。これをChromeでテストすると、「サーバーが利用できません」と表示されます。以下の@emuのトリックを使用すると、期待どおりに接続がハングします。何か不足していますか?
entpnerd

OPは、自分のサーバーのポート81に接続してタイムアウトになったと言っています。それも私にとってはうまくいきました。emuのソリューションでは、AndroidでUnknownHostExceptionが発生しました。
バリーフルーツマン2016

2
これにより、接続はタイムアウトではなく拒否されます。
Mehdi

425

10.255.255.1などのルーティング不可能なIPアドレスに接続します。


12
Idem、そしてgoogle.com:81はいつか到達可能かもしれないので、これはより良い答えだと思います。
Gui13、2012年

138
...そして、ユニットテストから他の人のサーバーにランダムパケットを送信するのは失礼です。
Glenn Maynard

15
これは常に機能するとは限りません。たとえば、Pythonのurllib場合、これは「ホストへのルートなし」例外を返します。FYI
マイクシュルツ

8
10.0.0.0、10.255.255.255、172.16.0.0、172.31.255.255、192.168.0.0、192.168.255.255これらはすべてルーティング不可能です。
rajesh_kw 2015

4
@FHIで言及されている「ホストへのルートがありません」エラーは、一般的に次の2つの状況で発生します。 ARPタイムアウト」)。(b)ルーターが対応するICMPエラーを返す場合。最初のケースは、テストするプライベートIPと同じサブネットにいる場合に発生します。2番目のケースは、ルーターがパケットを宛先にルーティングする方法を認識していないが、場合によってはICMPエラーを送信せずにパケットをドロップするだけの場合です。
エール2017

47

UNIXマシンを使用している場合は、netcatを使用してポートリスニングを開始できます。

nc -l 8099

次に、サービスを変更して、そのポートに対して通常行うことをすべて呼び出すようにします。たとえば、http:// localhost:8099 / some / sort / of / endpoint

次に、サービスは接続を開いてデータを書き込みますが、応答を取得することはないため、(接続が拒否されたのではなく)読み取りタイムアウトになります


1
アプリケーションが押しているデータを確認できるので便利です。アプリケーションが応答を要求しているかどうかを確認できます。
ポール、

これは、前述のように、ある種のエンドポイントにナビゲートする場合にも当てはまりますが、他の方法で接続しようとすると、すぐに接続が拒否されます。これは、今私が模倣しようとしている動作ではありません。
AlanSE 2017年

@AlanSE-どういう意味ですか?ポート番号の後は何でもかまいません。netcatはURLを処理する機能がないので気にしません
Tom Chamberlain

@TomChamberlainあらまあ、私が間違っていたことを知っているかもしれません。ssh接続タイムアウトをシミュレートしようとしています。だから私はそれにlocalhost、ポート8099を与えていますが、以前はユーザー名を与えていなかったので、何かを入れただけssh alanse@localhost -p 8099ではそれはそれをやっているようです。
AlanSE 2017年

7
ソケットレベルで接続タイムアウトをテストするには、ncプロセスをaでフリーズしますkill -STOP <pid>(またはバックグラウンドに置かずにCTRL-Zでフリーズします)。システムはサーバーが稼働しているかのように動作しますが、サーバーが接続を受け入れるまで待機するため、接続タイムアウト(errno 110)が発生します。
フィランティング

27

次のURLでは常にタイムアウトが発生し、@ Alexanderと@Emuの最良の回答が組み合わされています。

http://example.com:81

example.com:81example.comはDNS標準によって予約されているため、使用するとAlexanderの回答が改善されますgoogle.com:81。また、example.comは到達不能であると定義されているため、Googleのサーバーが溢れることはありません。

覚えやすいので、@ emuの回答よりも改善されたと思います。


2
現在example.com、93.184.216.34への解決が見られ、実際にはそれがドメインの例であることを説明する短いHTMLを提供しています...ポート81はまだ応答しません。
Beni Cherniavsky-Paskin 2017

問題は、example.comがそのように使用されることになっているのかどうかです。彼らが公式にテストパケットであふれることを無料にした場合にのみ、このドメインは他のどの商用ドメインよりも優れています。許可なくドメインをそのような目的に使用することは、違法ではないにしても、控えめに言っても非倫理的です。httpstat.us@AndyTheEntityが彼の回答で指摘したように使用することを検討してください。
マヌエル

@Manuelポイントを逃しています... example.com商用ドメインではありません。これは、使用不可として明示的に指定されている数少ないドメイン名の1つです。誰も所有することはできずexample.com、DNSルーターは実際のアドレスにルーティングしないことを認識しています。それは誰のサーバー時間の原価計算ではないですので、それを使用してと何も間違っているがある
speedplane

@speedplane IANAは規制によりドメインを所有し、の目的を説明するWebページを提供するWebサーバーを維持しますexample.com。ドメインの背後にインフラストラクチャがあるため、すべてのリクエストでIANAの費用がかかります。許可されている使用法はRFC 2606とRFC 6761で参照されてfloddingいます。言及したように、別のサーバーではなく、好きな目的でドメインを自由に使用することはできません。あなたの主張example.com is defined to be unreachableは正しくない、それは到達可能です。ポート81は現在到達不可能ですが、将来保証されるとどこに定義されていますか?
マヌエル

あなたが指すRFCは、DNSテストを特に許可します。.testではなく、トップレベルドメインの使用を推奨していますexample.comが、これらのドメインはこの目的のために明確に設定されています。はい、IANAに少々お金がかかるかもしれませんが、これは彼らが提供するサービスです。私たちのDNS料金はそれを払っています。
スピードプレーン


16

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()です。


私にはうまくいきません。何かが足りない。多分s.listen(5)前にs.accept()
bmaupin 2015

@bmaupinそれは合理的に聞こえますが、私はそれを忘れていたと思います。編集しました(ただし、バックログキューは0です)。ありがとうございます。
Henrik Heimbuerger、2015

1
リスニングとアクセプトのパーツをwhile True:ループに入れることができました。これは、テストのためにヒットするための優れた耐久性のあるタイムアウトの宛先になります。
AlanSE 2017

2
動作しますが、「接続タイムアウト」とは異なる「読み取りタイムアウト」エラーが発生します
timur

13
  • 10.0.0.0
  • 10.255.255.255
  • 172.16.0.0
  • 172.31.255.255
  • 192.168.0.0
  • 192.168.255.255

これらはすべてルーティング不可能です。


2
(受け入れられた回答についてコメントしたように)Node.jsでXMLHttpRequestをテストする10.0.0.010.255.255.255、タイムアウトではなく、EACCESエラーへの接続と起動が行われました。10.255.255.1172.16.0.0172.31.255.255192.168.0.0、と192.168.255.255しかし、タイムアウトをしました。
ジェイミーバーチ


8

ソフトウェアソリューションはどうですか:

アプリケーションサーバーにSSHサーバーをインストールします。次に、ソケットトンネルを使用して、アプリケーションサーバー上のローカルポートとリモートポートの間にリンクを作成します。これには、sshクライアントツールを使用できます。代わりに、クライアントアプリケーションをマップされたローカルポートに接続してください。次に、ソケットトンネルを自由に切断して、接続タイムアウトをシミュレートできます。


4

アクティブな接続を使用する場合は、http://httpbin.org/delay/#も使用できます。#は、サーバーが応答を送信する前にサーバーが待機する時間です。タイムアウトが遅延よりも短い限り、効果をシミュレートする必要があります。私はそれをpythonリクエストパッケージで正常に使用しました。

機密情報を送信する場合は、リクエストを変更する必要があります。送信されたデータがどうなるかはわかりません。


ただし、最大10秒(数値を大きくすると、10秒後に応答します)
Harry Wood

2

サーバーが応答するのにかかる時間を指定するAPIを呼び出すことにより、オリジンタイムアウトを人工的に作成できるサービスがあります。macgyverでのサーバータイムアウトは、このようなサービスの一例です。

たとえば、応答に15秒かかるリクエストをテストする場合は、macgyver APIに投稿リクエストを送信するだけです。

JSONペイロード:

{
    "timeout_length": 15000
}

API応答(15秒後):

{
    "response": "ok"
}

macgyverのサーバータイムアウトプログラム
https://askmacgyver.com/explore/program/server-timeout/3U4s6g6u


1

別のインターフェースを作成するMicrosoft Loopbackドライバーをインストールすることもできます。次に、自分のサービス(自分のホスト)に接続できます。次に、ネットワーク接続でそのようなインターフェースを無効/有効にすることができます...


1

OPがテストしたいものは完全には明確ではありませんが、存在しないホスト/ポートへの接続の試行と、既に確立されている接続のタイムアウトとの間には違いがあります。私はロブと一緒に行き、接続が機能するまで待ってからケーブルを引っ張ります。または-便宜上、仮想マシンを(ブリッジネットワークで)テストサーバーとして機能させ、接続が確立されたら仮想ネットワークインターフェイスを非アクティブ化します。


1

ランダムな接続タイムアウトをシミュレートするために頻繁に使用する手法は、sshローカルポート転送を使用することです。

ssh -L 12345:realserver.com:80 localhost

これにより、localhost:12345のトラフィックがrealserver.com:80に転送されます。必要に応じて、これを自分のローカルマシンでもループできます。

ssh -L 12345:localhost:8080 localhost

したがって、アプリケーションをローカルホストとカスタムポートに向けることができ、トラフィックはターゲットのホスト:ポートにルーティングされます。次に、このシェルを終了し(終了後にシェルをctrl + cする必要がある場合もあります)、転送が強制終了され、アプリで接続が失われたことがわかります。


0

他の接続/ケーブルがないスイッチにネットワークケーブルを差し込みます。それは私見で動作するはずです。


0

ネットワークの問題をシミュレートするために過去に使用した方法がいくつかあります。

  1. ネットワークケーブルを引き抜く
  2. マシンと「ターゲット」マシンの間のスイッチをオフにします(理想的には、コンピュータが接続されているスイッチに電力が供給されているため、マシンは「ネットワーク接続」を維持します)。
  3. 受信したデータをサイレントにドロップするファイアウォールソフトウェアをターゲットマシンで実行する

これらのアイデアの1つは、必要なシナリオを人工的に生成するいくつかの手段を提供する可能性があります


0

インストール/利用可能なファイアウォールソフトウェアに応じて、発信ポートをブロックでき、ファイアウォールの設定に応じて、接続要求パケットをドロップするだけです。接続要求なし、接続なし、タイムアウトが発生します。これは、ルーターレベルで実装された場合(リセットを送信する代わりにパケットをドロップする傾向があるか、状況に相当するものであれば何でも)おそらくうまく機能しますが、トリックを実行するソフトウェアパッケージも存在するはずです。


0

最も簡単な方法は、CurrPortsを使用して接続をドロップすることです

ただし、例外処理コードの単体テストを行うには、ネットワーク接続コードを抽象化し、オンデマンドで例外をスローするスタブ、モック、またはデコレーターを作成することを検討する必要があります。その後、実際にネットワークを使用する必要なく、アプリケーションのエラー処理ロジックをテストできます。


CurrPortsを使用すると、接続を閉じることしかできないようです(これにより、次の接続recv()がすぐに失敗します)。タイムアウトをシミュレートする方法が見つかりませんでした(つまり、転送されるデータはありませんが、接続は開いたままです)。
Henrik Heimbuerger 2013

オンデマンドで接続例外を模倣する単体テストを提案してくれたこの回答に感謝しました。
ダニーBullis

0

あなたと同じように私は問題を抱えていました。ソフトウェアの動作をテストするために、適切なタイミングでネットワークケーブルを取り外しました。ケーブルを抜く直前にブレークポイントを設定する必要がありました。

もう一度やり直している場合は、ネットワークケーブルにスイッチ(通常は閉じている瞬間的なプッシュボタン)を配置します。

物理的な切断によって別の動作が発生する場合は、コンピューターを安価なハブに接続し、ハブとメインネットワークの間に上記のスイッチを配置できます。

-編集-多くの場合、プログラムの特定のポイントに到達するまでネットワーク接続が機能している必要があります。その後、提供されている多くの提案の1つを使用して切断します。


0

私にとって最も簡単な方法は、宛先ネットワークに基づいてオフィスのルーターに静的ルートを追加することでした。応答しないホスト(コンピュータなど)にトラフィックをルーティングするだけで、リクエストのタイムアウトが発生します。

私にとって最高のことは、静的ルートをWebインターフェイス経由で管理し、簡単に有効/無効にできることです。


-1

たとえば、外部からは利用できない可能性のあるポートで、よく知られたWebサイトの1つに接続してみてください。ほとんどのファイアウォールはDROPモードで動作し、タイムアウトをシミュレートします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.