Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何模拟强制关闭的TCP连接?_.net_Sockets_Testing_Tcp - Fatal编程技术网

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

.net 如何模拟强制关闭的TCP连接?,.net,sockets,testing,tcp,.net,Sockets,Testing,Tcp,我的测试程序如何在其连接的TCP侦听器中导致“连接被强制关闭”错误 我的理解是,我必须在不遵循TCP协议的情况下关闭连接,即不发送“FIN”数据包。这可以通过TCP模式下的标准.NETSocket完成吗 我似乎可以通过打开几个连接然后终止测试程序来实现这一点,但我没有尝试过任何其他方法。您不应该通过打开几个连接然后终止测试程序来实现这一点。当程序退出时,内核应该负责关闭所有TCP连接(干净地,至少在TCP层及以下) 事实上,如果您可以从非特权用户空间执行任何操作来导致挂起/断开TCP连接,那么这

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

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

我似乎可以通过打开几个连接然后终止测试程序来实现这一点,但我没有尝试过任何其他方法。

您不应该通过打开几个连接然后终止测试程序来实现这一点。当程序退出时,内核应该负责关闭所有TCP连接(干净地,至少在TCP层及以下)

事实上,如果您可以从非特权用户空间执行任何操作来导致挂起/断开TCP连接,那么这是内核中的一个bug,应该予以修复:-)

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


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

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

一种方法是实施本SO问题中所述的:。(有关代码示例,请参见此处。)

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

第二个想法是使用一个模拟框架,如(开源)或商业框架,如Telerik(我个人偏好)。JustMock还提供了一个免费版本,非常适合这项任务,也可以用于社区项目。使用这样的框架,您就可以轻松地模拟出网络类的公共接口

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


无论哪种方式,mock都可以安排为抛出所需的异常,并测试您的代码是如何与之匹配的。

我可以通过使用该实用程序来实现这一点

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

  • 在管理员模式下运行当前端口
  • 看到连接时点击刷新
  • 右键单击并“关闭选定的TCP连接”(或使用ctl-T)

您可以从Microsoft站点下载tcp监控工具。 util名称为TcpView,用于监视和关闭tcp连接以模拟此情况

TcpView:


Hm。。。你说的有道理,但同时,只要用谷歌搜索“强行关闭”,你就会看到这个错误(一直)出现的频率。此外,如果ISP的电缆被拉断或灯熄灭,或者诸如此类的事情,当然也会发生这种情况。我们的应用程序不能在这种情况下崩溃和烧坏;它需要优雅地恢复。当然,网络故障、数据包丢失、电缆拉断、操作系统错误、路由器故障、内核崩溃和其他一百种情况都可能发生这种情况。但是您的主机TCP堆栈不会让用户空间软件故意造成它。但是您应该能够通过模拟套接字来充分测试您的应用程序,正如所解释的比我做的更详细。