Как эмулировать принудительно закрытое TCP-соединение? - PullRequest
3 голосов
/ 29 марта 2012

Как моя тестовая программа может вызвать ошибку "соединение было принудительно закрыто" в прослушивателе TCP, к которому она подключена?

Насколько я понимаю, мне придется закрыть соединение, не следуя протоколу TCP, а именнобез отправки пакета "FIN".Можно ли это сделать с помощью стандартного .NET Socket в режиме TCP?

Кажется, я могу сделать это, открыв несколько соединений, а затем завершив тестовую программу, но никак иначепробовал.

Ответы [ 4 ]

3 голосов
/ 06 июня 2013

Мне удалось это сделать с помощью утилиты CurrPorts .

. В своих целях я пытался протестировать сбой в стороннем SDK, который был вызван этой ошибкой..

  • Запустите CurrPorts в режиме администратора
  • Нажмите «Обновить», когда увидите соединение.
  • Щелкните правой кнопкой мыши и «Закрыть выбранные соединения TCP» (или используйте ctl-Т)
2 голосов
/ 29 марта 2012

В зависимости от вашей кодовой среды я вижу несколько возможностей.

Одним из способов будет реализация шаблона адаптера , как описано в этом вопросе SO здесь: TDD и Mocking out TcpClient .(См. Там примеры кода.)

Вы можете реализовать класс-оболочку, который сам использует TcpClient и mock интерфейс этого класса-оболочки.Делая это таким образом, вы отделяете вас от TcpClient и делаете переход на другие реализации или протоколы, если это необходимо.

Вторая идея заключается в том, чтобы использовать фреймворк, такой как Moq , RhinoMock (оба с открытым исходным кодом) или коммерческий, такой как Telerik JustMock (мои личные предпочтения).JustMock также предлагает бесплатную версию, которая хорошо подходит для этой задачи и может также использоваться в коммерческих проектах.Таким образом, использование такой инфраструктуры позволит вам легко смоделировать открытый интерфейс ваших сетевых классов.

Конечно, было бы также целесообразно использовать среду моделирования для первого варианта.

В любом случае, макеты могут быть скомпонованы так, чтобы выдавать нужные исключения и проверять, как ваш код от них реагирует.

2 голосов
/ 29 марта 2012

Вы должны не быть в состоянии достичь этого, открыв несколько соединений и затем завершив тестовую программу. Ядро должно позаботиться о закрытии всех соединений TCP (аккуратно, по крайней мере на уровне TCP и ниже), когда программа завершается.

На самом деле, если есть что-то, что вы можете сделать из непривилегированного пользовательского пространства, чтобы вызвать зависание / разрыв соединения TCP, это ошибка в вашем ядре, и она должна быть исправлена: -)

Ваш лучший вариант, вероятно, заключается в использовании сырых сокетов для внедрения любых пакетов, которые вы хотите. Вам придется создавать свои собственные заголовки TCP и IP на этих пакетах, но для целей модульного тестирования вы можете построить заголовки из в основном фиксированных значений с несколькими добавленными вариантами значений. Рекомендуется начинать с захвата пакетов нормального, работающего сеанс, добавьте RST-пакет в нужном месте и более или менее воспроизведите эту последовательность в своей тестовой программе.

Я думаю, что делать это для проверки вашего приложения - это излишне. С этим подходом вы в основном тестируете стек TCP хостов. Чтобы протестировать ваше приложение, вероятно, достаточно подправить сокет, чтобы он возвращал ошибку в нужное время.

0 голосов
/ 21 марта 2017

Вы можете скачать утилиту для мониторинга tcp с сайта Microsoft. Имя утилиты - TcpView, и она позволяет вам контролировать и закрывать ваши tcp-соединения для имитации этого условия.

TcpView:

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

...