收到连接超时后,我们的软件中出现了一个错误。这些错误非常罕见(通常是当我们的连接被内部网络断开时)。如何人工产生这种效果,以便测试我们的软件?
如果有关系,可以使用CAsyncSocket类以C ++ / MFC编写应用程序。
编辑:
我尝试使用不存在的主机,但收到套接字错误:
WSAEINVAL(10022)无效的参数
我的下一个尝试是使用Alexander的建议连接到其他端口,例如81(不过在我自己的服务器上)。效果很好。与断开的连接完全相同(等待60秒,然后出错)。谢谢!
收到连接超时后,我们的软件中出现了一个错误。这些错误非常罕见(通常是当我们的连接被内部网络断开时)。如何人工产生这种效果,以便测试我们的软件?
如果有关系,可以使用CAsyncSocket类以C ++ / MFC编写应用程序。
编辑:
我尝试使用不存在的主机,但收到套接字错误:
WSAEINVAL(10022)无效的参数
我的下一个尝试是使用Alexander的建议连接到其他端口,例如81(不过在我自己的服务器上)。效果很好。与断开的连接完全相同(等待60秒,然后出错)。谢谢!
Answers:
连接到现有主机,但连接到被防火墙阻止的端口,防火墙仅丢弃TCP SYN数据包。例如,www.google.com:81。
连接到不可路由的IP地址,例如10.255.255.1。
urllib
,这将返回“主机没有路由”异常。FYI
如果您使用的是UNIX计算机,则可以使用netcat启动端口侦听:
nc -l 8099
然后,修改您的服务以调用该端口通常执行的操作,例如http:// localhost:8099 / some / sort / of / endpoint
然后,您的服务将打开连接并写入数据,但永远不会得到响应,因此将为您提供读取超时(而不是拒绝连接)
ssh alanse@localhost -p 8099
,看起来就可以了。
kill -STOP <pid>
(或仅按住CTRL-Z而不在后台放置)。系统将像服务器正在运行一样工作,但是要等待服务器接受连接,从而导致连接超时(错误号110)。
以下URL总是给出超时,并结合了@Alexander和@Emu的最佳答案:
使用example.com:81
是对Alexander答案的一种改进,因为example.com是DNS标准保留的,因此它始终是不可访问的,这与google.com:81
Google可能会更改的方式不同。另外,由于example.com
定义为无法访问,因此您不会泛滥Google的服务器。
我想说这是对@emu答案的改进,因为它更容易记住。
example.com
解析为93.184.216.34,并且实际上提供了一个简短的HTML来解释这是一个示例域...端口81仍然没有响应。
httpstat.us
他的答案中指出的@AndyTheEntity。
example.com
这不是商业领域,它是被明确指定为不可用的少数几个域名之一。没有人可以拥有example.com
,DNS路由器知道它永远不会路由到真实地址。因此,这不会花费任何服务器时间,使用它没有任何问题
example.com
。该域背后有基础架构,因此每个请求都要花IANA钱。RFC 2606和RFC 6761中引用了允许的使用,您不能随意将域用于任何您想要的目的,就像flodding
您提到的那样,喜欢它们而不是其他服务器。您的主张example.com is defined to be unreachable
不正确,可以解决。端口81现在无法访问,但是将来定义在哪里?
.test
顶级域,而不是example.com
,但是显然已为此目的设置了这些域。是的,可能要花IANA一点钱,但这是他们提供的服务。我们的DNS费用正在支付。
您可以使用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()
呢?
while True:
循环放置,这似乎是一个不错的持久超时目标,可以进行测试。
如果要使用活动连接,也可以使用http://httpbin.org/delay/#,其中#是您希望服务器在发送响应之前等待的时间。只要您的超时时间短于延迟时间,就应该模拟效果。我已经成功地将其与python请求包一起使用了。
如果您要发送任何敏感内容,则可能需要修改您的请求-不知道发送给他们的数据会如何处理。
有可用的服务,使您可以通过调用API来人为地创建原始超时,在该API中您指定服务器将花费多长时间来响应。Macgyver上的服务器超时就是此类服务的一个示例。
例如,如果您想测试需要15秒才能响应的请求,则只需向macgyver API发出发布请求即可。
JSON有效负载:
{
"timeout_length": 15000
}
API响应(15秒后):
{
"response": "ok"
}
macgyver上的服务器超时程序
https://askmacgyver.com/explore/program/server-timeout/3U4s6g6u
尽管尚不完全清楚OP要测试哪一个:尝试与不存在的主机/端口建立连接与已建立的连接超时之间存在差异。我会和Rob一起去,等到连接正常后再拉电缆。或者-为方便起见-让虚拟机充当测试服务器(具有桥接网络),并在建立连接后立即停用虚拟网络接口。
根据已安装/可用的防火墙软件,您应该能够阻止传出端口,并且取决于防火墙的设置方式,它应该只丢弃连接请求数据包。没有连接请求,没有连接,发生了超时。如果它是在路由器级别实现的,则可能会更好(它们倾向于丢弃数据包而不是发送重置信息,或者与这种情况相当的其他信息),但是也肯定会有一个软件包可以解决这一问题。
最简单的方法是使用CurrPorts断开连接。
但是,为了对您的异常处理代码进行单元测试,也许您应该考虑抽象化您的网络连接代码,并编写一个存根,模拟或装饰器,以根据需要抛出异常。然后,您将能够测试应用程序错误处理逻辑,而无需实际使用网络。
recv()
立即失败),但找不到模拟超时的方法(即,不再传输任何数据,但连接保持打开状态)。
对我来说,最简单的方法是在基于目标网络的办公室路由器上添加静态路由。只需将流量路由到某些无响应的主机(例如您的计算机),您就会收到请求超时。
对我来说最好的是,静态路由可以通过Web界面进行管理,并且可以轻松启用/禁用。
您可以尝试通过端口(例如200)从外部无法访问的端口上连接到知名网站之一。大多数防火墙都在DROP模式下工作,它将为您模拟超时。