人为地创建连接超时错误

时间:2008-09-19 09:57:47

标签: networking network-programming connection tcp

我收到连接超时后,我的软件出现了错误。这些错误非常罕见(通常是我的内部网络丢失了我的连接)。如何人工生成这种效果,以便测试我们的软件?

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

修改

我尝试使用不存在的主机,我收到套接字错误:

  

WSAEINVAL(10022)参数无效

我的下一次尝试是使用Alexander建议连接到其他端口,例如81(虽然在我自己的服务器上)。这很有效。与断开的连接完全相同(60秒等待,然后错误)。谢谢!

21 个答案:

答案 0 :(得分:396)

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

答案 1 :(得分:271)

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

答案 2 :(得分:35)

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

nc -l 8099

然后,修改您的服务以调用它通常对该端口所做的任何操作,例如http://localhost:8099/some/sort/of/endpoint

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

答案 3 :(得分:21)

以下网址总是会超时,并结合了以上@Alexander和@ Emu的最佳答案:

http://example.com:81

使用example.com:81是对Alexander的答案的改进,因为example.com是由DNS标准保留的,所以它始终无法访问,与google.com:81不同,如果Google感觉可能会改变喜欢它。此外,由于example.com被定义为无法访问,因此您不会淹没Google的服务器。

我说它比@ emu的答案有所改进,因为它更容易记住。

答案 4 :(得分:16)

您可以使用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()期间超时。

答案 5 :(得分:13)

  • 10.0.0.0
  • 10.255.255.255
  • 172.16.0.0
  • 172.31.255.255
  • 192.168.0.0
  • 192.168.255.255

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

答案 6 :(得分:9)

我想请大家注意pathod

使用200:b@100:dr的配置(取自他们的示例),您将获得随机丢弃的连接。

答案 7 :(得分:8)

软件解决方案如何:

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

答案 8 :(得分:4)

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

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

答案 9 :(得分:2)

有些服务允许您通过调用API来人工创建原始超时,您可以在其中指定服务器响应的时间。 Macgyver上的服务器超时就是这种服务的一个例子。

例如,如果您想测试一个需要15秒钟响应的请求,您只需向macgyver API发送一个帖子请求。

JSON Payload:

{
    "timeout_length": 15000
}

API响应(15秒后):

{
    "response": "ok"
}

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

答案 10 :(得分:1)

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

答案 11 :(得分:1)

您可以安装Microsoft Loopback驱动程序,它将为您创建单独的界面。然后,您可以将它连接到您的某些服务(您自己的主机)。然后在网络连接中,您可以禁用/启用此类界面...

答案 12 :(得分:1)

我经常用来模拟随机连接超时的技术是使用ssh本地端口转发。

ssh -L 12345:realserver.com:80 localhost

这会将localhost:12345上的流量转发到realserver.com:80 如果需要,您也可以在自己的本地计算机中循环此操作:

ssh -L 12345:localhost:8080 localhost

因此,您可以将应用程序指向本地主机和自定义端口,然后流量将路由到目标主机:端口。然后,您可以退出此外壳程序(退出后可能还需要按ctrl + c外壳程序),它将终止转发,从而导致您的应用看到连接丢失。

答案 13 :(得分:0)

将网络电缆插入没有其他连接/电缆的交换机。这应该适用于imho。

答案 14 :(得分:0)

最简单的方法是使用CurrPorts删除您的连接。

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

答案 15 :(得分:0)

我遇到了与你一样的问题。为了测试软件行为,我只是在适当的时候拔掉了网线。在我想拔掉电缆之前,我必须设置一个断点。

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

如果物理断开导致不同的行为,您可以将计算机连接到廉价的集线器,并将上面提到的开关放在集线器和主网络之间。

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

答案 16 :(得分:0)

根据您安装/可用的防火墙软件,您应该能够阻止传出端口,并且根据防火墙的设置方式,它应该只丢弃连接请求数据包。没有连接请求,没有连接,超时随之而来。如果它是在路由器级别实现的(它们倾向于丢弃数据包而不是发送重置,或任何等效的情况),这可能会更好地工作但是必然会有一个软件包也可以做到这一点。 / p>

答案 17 :(得分:0)

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

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

答案 18 :(得分:0)

我过去曾使用过一些策略来模拟网络问题;

  1. 拔出网线
  2. 关闭交换机(理想情况下,计算机插入的交换机仍在通电,以便机器在机器和“目标”机器之间保持“网络连接”)
  3. 在目标计算机上运行防火墙软件,以静默方式丢弃收到的数据
  4. 其中一个想法可能会为您提供一些人工生成您需要的方案的方法

答案 19 :(得分:0)

很多好的答案,但是最干净的解决方案似乎是this service

http://httpstat.us/504?sleep=60000

您可以配置超时时间(最长230秒)和最终的返回码。

答案 20 :(得分:-1)

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