我的测试程序如何在它连接到的TCP侦听器中导致“连接被强制关闭”错误?
我的理解是我必须在不遵循TCP协议的情况下关闭连接,即不发送“FIN”数据包。这可以通过TCP模式下的标准.NET Socket
来完成吗?
我似乎可以通过打开几个连接然后终止测试程序来做到这一点,但不是我尝试过的任何其他方式。
答案 0 :(得分:3)
我可以使用实用程序CurrPorts完成此操作。
出于我的目的,我试图测试由此错误导致的第三方SDK中的崩溃。
答案 1 :(得分:2)
您应 通过打开多个连接然后终止测试程序来实现此目的。当程序退出时,内核应该关闭所有TCP连接(干净利落,至少在TCP层及以下)。
事实上,如果你可以从非特权用户空间做任何事情来导致挂起/断开的TCP连接,那么这是你内核中的一个错误,应该修复: - )
您最好的选择可能是使用原始套接字来注入您想要的任何数据包。你必须建立自己的TCP&这些数据包上的IP头,但出于单元测试的目的,您可以构建大多数固定值的标头,并引入一些变量值。建议从正常工作会话的数据包捕获开始,在右侧添加RST数据包在你的测试程序中,或多或少地回放那个序列。
我认为这样做是为了测试你的应用程序是过度的。您主要使用此方法测试主机的TCP堆栈。要测试你的应用程序,模拟套接字以便它在正确的时间返回错误可能已经足够了。
答案 2 :(得分:2)
根据您的代码环境,我看到了几种可能性。
一种方法就是按照此SO问题中的说明实现Adapter pattern:TDD and Mocking out TcpClient。 (请参阅那里的代码示例。)
您可以实现一个包装类,它本身使用TcpClient和 mock 该包装类的接口。这样做可以将您与TcpClient分离,并在需要时更改为其他实现或协议。
第二个想法是使用像Moq,RhinoMock(两个开源)或商业网站(如Telerik的JustMock(我的)这样的模拟框架个人喜好)。 JustMock还提供适合此任务的免费版本,也可用于纪念项目。使用这样的框架,您可以轻松地模拟网络类的公共接口。
当然,对第一个选项使用模拟框架也是有意义的。
无论哪种方式,模拟都可以安排抛出所需的异常并测试你的代码如何对它进行测试。
答案 3 :(得分:0)
您可以从Microsoft站点下载tcp monitoring util。 util名称是TcpView,让您监视和关闭tcp连接以模拟这种情况。
套装软件:
https://technet.microsoft.com/en-us/sysinternals/tcpview.aspx