人为地创build连接超时错误

我收到连接超时时发生了一个软件错误。 这些错误是非常罕见的(通常当我的连接被我们的内部networking丢弃时)。 我怎么能人为地产生这种效果,所以我可以testing我们的软件?

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

编辑:

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

WSAEINVAL(10022)无效的参数

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

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

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

如果您使用的是unix机器,则可以使用netcat启动端口监听:

 nc -l 8099 

然后,修改你的服务来调用通常对该端口做的任何事情,例如http:// localhost:8099 / some / sort / of / endpoint

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

您可以使用Python REPL来模拟接收数据时的超时(即成功build立连接后)。 只需要一个标准的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() 

现在它等待一个传入的连接。 连接任何你想testinglocalhost:9000 。 当你这样做时,Python将接受连接, accept()将返回它。 除非通过clientsocket发送任何数据,否则调用者的套接字在下一个recv()过程中应该超时。

10.0.0.0,10.255.255.255,172.16.0.0,172.31.255.255,192.168.0.0,192.168.255.255

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

我想指出大家的注意力

200:b@100:dr )的configuration(从他们的例子中可以看出),你会得到一个随机丢失的连接。

一个软件解决scheme如何:

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

以下url总是给出超时时间,并将@Alexander和@Emu的最佳答案结合在一起:

http://example.com:81

使用example.com:81是对Alexander答案的一个改进,因为example.com是由DNS标准保留的,所以它总是无法访问,不像google.com:81 ,如果Google觉得它可能会改变。 另外,因为example.com被定义为无法访问,所以您不会淹没Google的服务器。

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

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

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

过去我曾经使用过一些策略来模拟networking问题,

  1. 拔出网线
  2. 在您的机器和“目标”机器之间closures交换机(理想情况下,插入计算机的交换机仍处于通电状态,以使机器保持“networking连接”状态)
  3. 在目标机器上运行防火墙软件,以静默方式丢弃收到的数据

其中一个想法可能会为您提供一些手动生成所需场景的方法

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

尽pipe目前还不清楚OP要testing哪一个:尝试连接到不存在的主机/端口和已经build立连接的超时之间是有区别的。 我会和Rob一起去,等到连接工作,然后拉电缆。 或者 – 为了方便 – 将虚拟机作为testing服务器(具有桥接networking),并且只要build立连接就停用虚拟networking接口。

有些服务可以让你通过调用一个API来人为地创build源超时,在这个API中你指定了服务器响应的时间。 在macgyver上的服务器超时是这种服务的一个例子。

例如,如果你想testing一个需要15秒的请求来响应,你只需要向macgyver API发送一个post请求。

JSON有效负载:

 { "timeout_length": 15000 } 

API响应(15秒后):

 { "response": "ok" } 

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

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

我喜欢在debugging时使用CurrPorts来操纵networking连接。 有时候,只要拔掉网线就可以了(就像其他人一样)。

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

我的问题和你所做的一样。 为了testing软件的行为,我只是在适当的时候拔掉网线。 在我想要拔下电缆之前,我必须设置一个断点。

如果我再次这样做,我会把一个开关(一个常闭瞬时button之一)放入networking电缆。

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

– 编辑 – 在许多情况下,你需要networking连接工作,直到你的程序中的某个点,然后你要断开提供的许多build议之一。

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

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

您可以尝试连接到一个可能无法从外部访问的端口上的着名网站 – 例如200。 大多数防火墙工作在DROP模式下,它会模拟你的超时。

最简单的事情就是使用CurrPorts来删除你的连接。

然而,为了unit testing你的exception处理代码,也许你应该考虑抽象你的networking连接代码,并编写一个存根,模拟或装饰器,它会根据需要抛出exception。 然后,您将能够testing应用程序error handling逻辑,而不必实际使用networking。