如何模拟强制关闭的TCP连接?

时间:2012-03-29 12:51:04

标签: .net sockets testing tcp

我的测试程序如何在它连接到的TCP侦听器中导致“连接被强制关闭”错误?

我的理解是我必须在不遵循TCP协议的情况下关闭连接,即不发送“FIN”数据包。这可以通过TCP模式下的标准.NET Socket来完成吗?

我似乎可以通过打开几个连接然后终止测试程序来做到这一点,但不是我尝试过的任何其他方式。

4 个答案:

答案 0 :(得分:3)

我可以使用实用程序CurrPorts完成此操作。

出于我的目的,我试图测试由此错误导致的第三方SDK中的崩溃。

  • 以管理员模式运行CurrPorts
  • 看到连接后点按“刷新”。
  • 右键单击并“关闭所选TCP连接”(或使用ctl-T)

答案 1 :(得分:2)

您应 通过打开多个连接然后终止测试程序来实现此目的。当程序退出时,内核应该关闭所有TCP连接(干净利落,至少在TCP层及以下)。

事实上,如果你可以从非特权用户空间做任何事情来导致挂起/断开的TCP连接,那么这是你内核中的一个错误,应该修复: - )

您最好的选择可能是使用原始套接字来注入您想要的任何数据包。你必须建立自己的TCP&这些数据包上的IP头,但出于单元测试的目的,您可以构建大多数固定值的标头,并引入一些变量值。建议从正常工作会话的数据包捕获开始,在右侧添加RST数据包在你的测试程序中,或多或少地回放那个序列。

我认为这样做是为了测试你的应用程序是过度的。您主要使用此方法测试主机的TCP堆栈。要测试你的应用程序,模拟套接字以便它在正确的时间返回错误可能已经足够了。

答案 2 :(得分:2)

根据您的代码环境,我看到了几种可能性。

一种方法就是按照此SO问题中的说明实现Adapter patternTDD and Mocking out TcpClient。 (请参阅那里的代码示例。)

您可以实现一个包装类,它本身使用TcpClient和 mock 该包装类的接口。这样做可以将您与TcpClient分离,并在需要时更改为其他实现或协议。

第二个想法是使用像MoqRhinoMock(两个开源)或商业网站(如Telerik的JustMock(我的)这样的模拟框架个人喜好)。 JustMock还提供适合此任务的免费版本,也可用于纪念项目。使用这样的框架,您可以轻松地模拟网络类的公共接口。

当然,对第一个选项使用模拟框架也是有意义的。

无论哪种方式,模拟都可以安排抛出所需的异常并测试你的代码如何对它进行测试。

答案 3 :(得分:0)

您可以从Microsoft站点下载tcp monitoring util。 util名称是TcpView,让您监视和关闭tcp连接以模拟这种情况。

套装软件:

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