人为地创建连接超时错误


291

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

如果有关系,可以使用CAsyncSocket类以C ++ / MFC编写应用程序。

编辑:

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

WSAEINVAL(10022)无效的参数

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


嗨,马克,我尝试了适合您的解决方案,但是我收到的是#503(服务不可用)。不应该是以下之一:#504(网关超时),#599(网络连接超时错误),#598(网络读取超时错误)。
CoDe19年

Answers:


297

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


6
这个答案很简单,就像@emu的答案一样。我了解此答案并非建议使用google.com:81,但此处的要点是使用另一个被阻止的端口。因此,您始终可以使用<your-own-ip>:<blocked-port>。
James Selvakumar 2014年

6
除非是您自己的服务器,否则打其他服务器进行测试是不礼貌的。通过点击不可路由的IP地址(例如10.255.255.1)来使用诸如下面提到的一个emu之类的文明解决方案,或者设置自己的虚拟服务器以进行测试。
zeeshan 2015年

2
我认为Google可能已经阻止了此端口。当我使用Chrome进行测试时,我只是“服务器不可用”。当我在下面使用@emu的技巧时,连接将按预期方式挂起。我想念什么吗?
entpnerd

OP说他连接到自己服务器上的端口81 并超时。这也对我有用。mu的解决方案给了我Android上的UnknownHostException。
巴里·弗鲁特曼

2
这样会给连接拒绝而不是超时。
Mehdi

425

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


12
同上,我想这是一个更好的答案,因为有一天google.com:81可以到达。
Gui13 2012年

138
...并且因为从您的单元测试中向其他人的服务器发送随机数据包是不礼貌的。
格伦·梅纳德

15
这并不总是有效。例如,使用Python的urllib,这将返回“主机没有路由”异常。FYI
迈克·舒尔茨

8
10.0.0.0,10.255.255.255,172.16.0.0,172.31.255.255,192.168.0.0,192.168.255.255这些都是不可路由的。
rajesh_kw 2015年

4
@FHI提到的“没有通往主机的路由”错误通常在两种情况下出现:(a)当您尝试连接到本地LAN中的不可访问主机时(这意味着它不回答ARP查询,因此基本上是“ ARP超时”)。(b)当路由器返回相应的ICMP错误时。如果您与测试的专用IP处于同一子网中,则发生第一种情况。第二种情况是路由器不知道如何将数据包路由到其目的地,但是在某些情况下,他们只是丢弃数据包而没有发送ICMP错误。
Ale

47

如果您使用的是UNIX计算机,则可以使用netcat启动端口侦听:

nc -l 8099

然后,修改您的服务以调用该端口通常执行的操作,例如http:// localhost:8099 / some / sort / of / endpoint

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


1
这很有用,因为您可以看到应用程序要推送的任何数据。您可以检查您的应用程序是否要求响应。
保罗

如上所述,这对于导航到某种端点是正确的,但是如果我尝试以其他方式连接,它会迅速导致连接被拒绝,这不是我现在要尝试的行为。
AlanSE

@AlanSE-您是什么意思?端口号后可以有任何内容;netcat不会在乎,因为它无法处理任何URL
Tom Chamberlain

@TomChamberlain哦,等等,我可能知道我做错了。我正在尝试模拟ssh连接超时。因此,我给它提供了localhost,端口8099,但是以前我没有提供用户名,因此,如果我只是放入东西ssh alanse@localhost -p 8099,看起来就可以了。
AlanSE

7
要在套接字级别测试连接超时,请使用冻结nc进程kill -STOP <pid>(或仅按住CTRL-Z而不在后台放置)。系统将像服务器正在运行一样工作,但是要等待服务器接受连接,从而导致连接超时(错误号110)。
philant

27

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

http://example.com:81

使用example.com:81是对Alexander答案的一种改进,因为example.com是DNS标准保留的,因此它始终是不可访问的,这与google.com:81Google可能会更改的方式不同。另外,由于example.com定义为无法访问,因此您不会泛滥Google的服务器。

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


2
目前我看到example.com解析为93.184.216.34,并且实际上提供了一个简短的HTML来解释这是一个示例域...端口81仍然没有响应。
贝尼·切尔尼亚夫斯基-帕斯金

问题实际上是example.com是否应该以这种方式使用。仅当它们正式免费发布测试数据包时,此域才比任何其他商业域都要好。至少可以说,未经许可而将域用于此目的是不道德的,即使不是违法的,因为要花费一些人来处理这些数据包的费用。考虑使用httpstat.us他的答案中指出的@AndyTheEntity。
曼努埃尔

@Manuel您遗漏了一点…… example.com这不是商业领域,它是被明确指定为不可用的少数几个域名之一。没有人可以拥有example.com,DNS路由器知道它永远不会路由到真实地址。因此,这不会花费任何服务器时间,使用它没有任何问题
speedplane

@speedplane IANA依法拥有该域,并维护一个Web服务器,该服务器提供一个说明...用途的网页example.com。该域背后有基础架构,因此每个请求都要花IANA钱。RFC 2606和RFC 6761中引用了允许的使用,您不能随意将域用于任何您想要的目的,就像flodding您提到的那样,喜欢它们而不是其他服务器。您的主张example.com is defined to be unreachable不正确,可以解决。端口81现在无法访问,但是将来定义在哪里?
曼努埃尔

您指向的RFC特别允许进行DNS测试。他们建议您使用.test顶级域,而不是example.com,但是显然已为此目的设置了这些域。是的,可能要花IANA一点钱,但这是他们提供的服务。我们的DNS费用正在支付。
快艇

22

很多好的答案,但最干净的解决方案似乎是这项服务

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

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


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,否则调用者的套接字在next期间将超时recv()


对我不起作用;缺少一些东西。也许s.listen(5)以前s.accept()呢?
bmaupin 2015年

@bmaupin听起来很合理,我想我只是忘记了这一点。立即编辑(但积压队列为0),谢谢!
Henrik Heimbuerger

1
我能够将侦听和接受部分while True:循环放置,这似乎是一个不错的持久超时目标,可以进行测试。
AlanSE '17

2
它可以工作,但是会显示“读取超时”错误,与“连接超时”不同
timur

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

所有这些都是无法路由的。


2
(正如我对接受的答案所做的评论一样)当我在Node.js中测试XMLHttpRequest时,连接10.0.0.010.255.255.255引发了EACCES错误,而不是超时。10.255.255.1172.16.0.0172.31.255.255192.168.0.0,并192.168.255.255没有超时,但是。
杰米·伯奇

9

我想在这里大家注意pathod

通过配置(取自他们的示例),200:b@100:dr您将获得随机断开的连接。


1
与超时不同
dentarg

8

软件解决方案如何:

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


4

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

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


不过最多10秒(如果输入的数字更大,它将在10秒后响应)
哈里·伍德

2

有可用的服务,使您可以通过调用API来人为地创建原始超时,在该API中您指定服务器将花费多长时间来响应。Macgyver上的服务器超时就是此类服务的一个示例。

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

JSON有效负载:

{
    "timeout_length": 15000
}

API响应(15秒后):

{
    "response": "ok"
}

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


1

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


1

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


1

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

ssh -L 12345:realserver.com:80 localhost

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

ssh -L 12345:localhost:8080 localhost

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


0

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


0

过去,我使用了两种策略来模拟网络问题。

  1. 拔出网线
  2. 关闭计算机和“目标”计算机之间的开关(理想情况下,请保持计算机已插入电源的开关处于接通状态,以便计算机保持其“网络连接”)
  3. 在目标计算机上运行防火墙软件,以静默方式删除接收到的数据

这些想法之一可能会为您提供一些方法,以人工生成所需的方案


0

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


0

最简单的方法是使用CurrPorts断开连接。

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


使用CurrPorts,我似乎只能关闭连接(这将导致下一个recv()立即失败),但找不到模拟超时的方法(即,不再传输任何数据,但连接保持打开状态)。
Henrik Heimbuerger

我感谢这个答案,因为它建议了一个单元测试,该单元测试可以按需模拟连接异常。
丹尼·布利斯

0

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

如果再次进行此操作,则将一个开关(一个常闭的瞬时按钮一个)插入网络电缆中。

如果物理断开连接导致了不同的行为,则可以将计算机连接到便宜的集线器,然后在集线器和主网络之间放置上面提到的交换机。

-编辑-在许多情况下,您需要网络连接才能工作,直到到达程序中的特定位置为止,然后您将要使用提供的许多建议之一断开连接。


0

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

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.