2012-03-29 49 views
2

接続しているTCPリスナーのテストプログラムで「接続が強制終了されました」というエラーが発生する強制的に閉じたTCP接続をエミュレートするには?

私の理解では、TCPプロトコルに従わずに、つまり「FIN」パケットを送信せずに接続を閉じる必要があると私は理解しています。これは、TCPモードで標準の.NET Socketで行うことができますか?

私は、いくつかの接続を開いてテストプログラムを終了することでこれを行うことができますが、私が試した他の方法ではできません。

答えて

2

では、いくつかの接続を開いてテストプログラムを終了することでこれを実現できます。カーネルは、プログラムが終了するときに、TCP接続のすべてを(きれいに、少なくともTCPのレイヤー以下で)閉じなければなりません。

は実際には、あなたがハング/壊れたTCPコネクションを引き起こすことが、非特権ユーザ空間から行うことができ、すべてのものがある場合、それはあなたのカーネルのバグだと

あなたの最高のオプションです:-)修正する必要がありますたぶん、rawソケットを使用して、必要なパケットを注入します。これらのパケットに独自のTCP & IPヘッダーを構築する必要がありますが、単体テストの目的では、いくつかのvariant値を入れた固定値からヘッダを構築することができます。通常のパケットキャプチャRSTパケットを適切な場所に追加し、テストプログラムでそのシーケンスを多かれ少なかれ再生します。

私はあなたのアプリケーションをテストするためにこれを行うことは過度のことだと思います。あなたは主にこのアプローチでホストのTCPスタックをテストしています。アプリケーションをテストするには、適切なタイミングでエラーを返すようにソケットを嘲笑してください。

+2

フム...あなたの言うこと(理にかなっているが、同時に、単に「強制閉鎖」のためにGoogleとこのエラーがアップ作物どれだけ頻繁に表示されますすべての時間)。また、ケーブルがヤンクされたり、電灯がISPに出ていたり、そのようなものがあると、確実にこれが起こる可能性があります。私たちのアプリはこのような状況でちょうどクラッシュして焼けることはありません。それは正常に回復する必要があります。 –

+0

絶対に、これはネットワークのトラブル、パケットの損失、ケーブルの引っ張り、OSのバグ、ルータの障害、カーネルのクラッシュ、およびその他の100のシナリオで発生する可能性があります。しかし、あなたのホストのTCPスタックは、ユーザスペースソフトウェアが意図的にそれを引き起こさせることはありません。しかし、[Jens H](http://stackoverflow.com/users/219344/jens-h)で説明されているように、私が行ったよりも詳細にソケットを模擬してアプリケーションを適切にテストできるはずです。 – Celada

2

コード環境によっては、いくつかの可能性があります。

一方向は、ここでこのSO質問に記載されているようにAdapter patternを実装することです。TDD and Mocking out TcpClient

TcpClientとモックのラッパークラスのインターフェイスを使用するラッパークラスを実装できます。このようにすると、TcpClientからあなたが切り離され、必要に応じて他の実装やプロトコルに変更されます。

アイデアはMoqRhinoMock(両方ともオープンソース)またはTelerikのJustMock(私の個人的な好み)のような商用のようなモックフレームワークを使用することです。 JustMockはまた、この作業に適した無料版を提供しています。また、コミュニケーションプロジェクトでも使用できます。このようなフレームワークを使用すると、ネットワーククラスのパブリックインターフェイスを簡単に模擬することができます。

もちろん、最初のオプションのために模擬フレームワークを使用することも意味があります。

いずれにしても、モックは、の例外をスローするように設定されたとなり、コードがどのようにそれに変換されるかをテストできます。

3

ユーティリティCurrPortsを使用してこれを達成できました。

私の目的として、このエラーが原因で発生したサードパーティのSDK内でクラッシュをテストしようとしていました。管理者モードで

  • 実行CurrPortsは
  • あなたが接続を見たときに更新をヒット。
  • 右クリック
  • と "閉じる選択したTCPコネクション"(またはCTL-Tを使用)
0

あなたは、MicrosoftのサイトからUTIL TCPの監視をダウンロードすることができます。 util名はTcpViewで、この状態をシミュレートするためにtcp接続を監視して閉じることができます。

TcpView:

https://technet.microsoft.com/en-us/sysinternals/tcpview.aspx

関連する問題