人为创建连接超时错误

人为创建连接超时错误

问题描述:

我收到连接超时时发生了软件中的错误。这些错误非常罕见(通常当我的内部网络连接断开时)。我怎么能人为地产生这种效果,所以我可以测试我们的软件?人为创建连接超时错误

如果有问题,应用程序是使用CAsyncSocket类在C++/MFC中编写的。

编辑:

我用一个不存在的主机尝试,我也得到了套接字错误:

WSAEINVAL (10022) Invalid argument

我的下一个尝试是使用连接的Alexander的建议一个不同的端口,例如81(尽管我自己的服务器上)。这很好。与丢弃的连接完全相同(60秒等待,然后错误)。谢谢!

连接到现有主机,但连接到防火墙阻止的端口,该端口只会丢弃TCP SYN数据包。例如,www.google.com:81。

+4

这个答案很简单,就像@ emu的答案一样。我明白这个答案并不打算建议使用google.com:81,但这里的要点是使用被阻止的不同端口。所以你总是可以使用。 – 2014-08-14 03:58:33

+2

除非它是你自己的服务器,否则它无法击中其他服务器进行测试。使用像下面提到的那个emu这样的文明解决方案,通过点击不可路由的IP地址(如10.255.255.1),或者为了测试目的而设置您自己的虚拟服务器。 – zeeshan 2015-04-09 15:19:06

+2

我认为谷歌可能已经阻止了这个端口。当我使用Chrome进行测试时,我只是“服务器不可用”。当我在下面使用@ emu的技巧时,连接按预期挂起。我错过了什么吗? – entpnerd 2015-12-09 21:48:30

将网络电缆插入没有其他连接/电缆的交换机。这应该工作恕我直言。

过去有几种策略用于模拟网络问题;

  1. 拔出网线
  2. 关掉开关(最好用计算机插入仍在供电,因此该机保持它的“网络连接”的开关),机器和“目标”之间这会丢弃收到的数据
  3. 在目标机器上机
  4. 运行防火墙软件

其中的一个想法可能给你一些手段人为地产生的情况下,你需要

根据您已安装/可用的防火墙软件,您应该能够阻止出站端口,并且取决于防火墙的设置方式,应该放弃连接请求数据包。没有连接请求,没有连接,超时发生。如果它是在路由器级别实现的话,这可能会更好(它们倾向于丢弃数据包而不是发送重置,或者相当于这种情况),但肯定会有一个软件包可以做到这一点。

我的问题与您所做的相同。为了测试软件的行为,我只是在适当的时候拔掉了网线。在我想拔下电缆之前,我必须设置一个断点。

如果我再次这样做,我会在网线中放置一个开关(一个常闭瞬时按钮)。

如果物理断开连接导致不同的行为,可以将计算机连接到便宜的集线器,并将上述交换机连接到集线器和主网络之间。

- 编辑 - 在许多情况下,您需要网络连接工作,直到您的程序中的某个点,然后您需要使用提供的许多建议之一断开连接。

你可以尝试连接到的可能不是从外部端口上知名网站的一种 - 200为例。大多数防火墙在DROP模式下工作,它会模拟你的超时时间。

最简单的事情将是使用拖放您CurrPorts连接。

但是,为了进行单元测试你的异常处理代码,也许你应该考虑抽象您的网络连接代码,写一个存根,模拟或装饰会抛出异常的需求。然后,您将能够测试应用程序错误处理逻辑,而无需实际使用网络。

+0

使用CurrPorts,我似乎只能关闭连接(导致下一个`recv()`立即失败),但找不到一种模拟超时的方式(即不再传输数据,但连接保持打开状态)。 – 2013-04-16 21:56:28

您可能会安装Microsoft Loopback驱动程序,它将为您创建一个单独的界面。然后你可以连接到你的一些服务(你自己的主机)。然后,在网络连接,您可以禁用/启用这样的接口...

尽管它并不完全清楚哪一个OP想要测试:有尝试一个不存在的主机/端口和连接之间的差异已建立连接的超时。我会和Rob一起去,等到连接正常后再拔电缆。或者 - 为了方便起见 - 将虚拟机作为测试服务器(具有桥接网络),并且只要连接建立就停用虚拟网络接口。

连接到非可路由的IP地址,如10.255.255.1。

+11

同样,我想这是一个更好的答案,因为google.com:81可能有一天可以到达。 – Gui13 2012-01-27 15:00:32

软件解决方案如何:

在应用程序服务器上安装SSH服务器。然后,使用套接字隧道在您的本地端口与应用程序服务器上的远程端口之间创建链接。您可以使用ssh客户端工具来执行此操作。让您的客户端应用程序连接到您映射的本地端口。然后,您可以随意中断套接字隧道以模拟连接超时。

可以使用Python REPL模拟超时而接收数据(连接已经成功地建立,即后)。只需要一个标准的Python安装。

Python 2.7.4 (default, Apr 6 2013, 19:54:46) [MSC v.1500 32 bit (Intel)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import socket 
>>> s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)   
>>> s.bind(('localhost', 9000)) 
>>> s.listen(0) 
>>> (clientsocket, address) = s.accept() 

现在它等待传入连接。连接任何你想测试localhost:9000。当你这样做时,Python将接受连接,并且accept()将返回它。除非通过clientsocket发送任何数据,否则在下一个recv()期间,主叫方的套接字应该超时。

我想指出大家的注意pathod

有了一个配置(从他们的实例所)的200:[email protected]:dr你会得到随机中断的连接。

10.0.0.0,10.255.255.255,172.16.0.0,172.31.255.255,192.168.0.0,192.168.255.255

,所有这些都是不可路由。

如果你是在UNIX机器上,你就可以开始使用端口监听的netcat:

nc -l 8099 

然后,修改你的服务调用不管它通常不会到该端口例如http://localhost:8099/some/sort/of/endpoint

然后,您的服务将打开连接和写入数据,但永远不会得到响应,所以会给你一个读超时(而不是拒绝连接)

对我来说,最简单的方法是添加静态基于目标网络的办公室路由器上的路由。只需将流量路由到某些无响应的主机(例如您的计算机),您将获得请求超时。

对我来说最好的事情是静态路由可以通过Web界面进行管理,并且可以轻松启用/禁用。

如果您想要使用活动连接,您还可以使用http://httpbin.org/delay/#,其中#是希望服务器在发送响应之前等待的时间。只要你的超时时间短于延迟...应该模拟效果。我已经成功地将它与python requests包一起使用。

如果您发送任何敏感内容,您可能需要修改您的请求 - 不知道发送给它们的数据会发生什么情况。

有些服务可让您通过调用指定服务器响应的时间长度的API来人工创建原点超时。在macgyver上的服务器超时是这种服务的一个例子。

例如,如果您想测试需要15秒才能响应的请求,则只需向macgyver API发出发布请求即可。

JSON有效载荷:

{ 
    "timeout_length": 15000 
} 

API响应(15秒后):上百战天龙

{ 
    "response": "ok" 
} 

服务器超时程序
https://askmacgyver.com/explore/program/server-timeout/3U4s6g6u

以下URL总是给人一种超时,和结合了@Alexander和@Emu的最佳答案:

http://example.com:81

使用example.com:81是亚历山大的回答的改进,因为example.com是由DNS标准保留,所以它永远是不可到达的,不像google.com:81,如果谷歌感觉就像它可能改变。另外,由于example.com被定义为无法访问,因此您不会淹没Google的服务器。

我认为这是对@ emu答案的改进,因为它更容易记住。