345

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

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

编辑:

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

WSAEINVAL (10022) 参数无效

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

4

21 回答 21

484

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

于 2009-05-24T20:42:43.377 回答
358

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

于 2008-09-19T10:02:57.660 回答
64

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

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

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

于 2019-06-05T11:27:52.907 回答
62

如果您在 unix 机器上,您可以使用 netcat 启动端口侦听:

nc -l 8099

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

然后,您的服务将打开连接并写入数据,但永远不会得到响应,因此会给您一个 Read Time Out(而不是 Connection Refused)

于 2016-05-26T15:50:18.750 回答
42

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

http://example.com:81

使用example.com:81是对亚历山大答案的改进,因为 example.com 是由 DNS 标准保留的,所以它总是无法访问的,不像google.com:81,如果谷歌喜欢它可能会改变。此外,由于example.com定义为不可访问,因此您不会淹没 Google 的服务器。

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

于 2016-11-07T06:45:10.217 回答
18
  • 10.0.0.0
  • 10.255.255.255
  • 172.16.0.0
  • 172.31.255.255
  • 192.168.0.0
  • 192.168.255.255

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

于 2015-07-23T07:54:41.807 回答
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().

于 2013-04-16T22:09:50.350 回答
10

我想向大家指出mitmproxy

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

于 2014-02-20T10:45:35.323 回答
7

软件解决方案怎么样:

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

于 2010-03-12T15:05:33.053 回答
6

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

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

于 2016-08-15T19:30:03.793 回答
2

有一些可用的服务允许您通过调用 API 来人为地创建原始超时,您可以在其中指定服务器响应所需的时间。macgyver 上的服务器超时是此类服务的一个示例。

例如,如果您想测试一个需要 15 秒才能响应的请求,您只需向 macgyver API 发出一个 post 请求。

JSON有效负载:

{
    "timeout_length": 15000
}

API 响应(15 秒后):

{
    "response": "ok"
}

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

于 2016-09-11T23:22:14.663 回答
1

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

于 2008-09-19T10:10:40.950 回答
1

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

于 2008-09-19T13:20:35.240 回答
1

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

ssh -L 12345:realserver.com:80 localhost

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

ssh -L 12345:localhost:8080 localhost

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

于 2019-03-27T21:08:06.613 回答
0

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

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

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

于 2008-09-19T10:03:27.517 回答
0

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

于 2008-09-19T10:03:38.517 回答
0

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

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

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

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

于 2008-09-19T10:09:43.680 回答
0

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

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

于 2008-09-19T10:10:20.420 回答
0

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

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

于 2016-08-11T18:40:15.913 回答
-1

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

于 2008-09-19T10:09:57.363 回答
-2

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

于 2008-09-19T10:00:33.033 回答