我在我们的软件中有一个错误,当我收到连接超时时发生。这些错误是非常罕见的(通常是当我的连接被我们的内部网络丢弃时)。我怎样才能人为地产生这种效果来测试我们的软件呢?

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

编辑:

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

无效的参数

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


当前回答

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

其他回答

软件解决方案怎么样:

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

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

如果你要发送任何敏感的东西,你可能需要修改你的请求——不知道发送给他们的数据会发生什么。

尽管还不完全清楚OP想要测试哪一个:尝试连接到不存在的主机/端口和超时已经建立的连接之间是有区别的。我会和罗布一起去,等连接好了再拉电缆。或者——为了方便起见——让虚拟机作为测试服务器(使用桥接网络),一旦建立连接,就取消激活虚拟网络接口。

您可以使用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()将返回它。除非您通过客户端套接字发送任何数据,否则调用方的套接字应该在下一次recv()期间超时。

有一些可用的服务允许您通过调用API(在其中指定服务器响应所需的时间)来人为地创建原始超时。macgyver上的Server Timeout就是这样一个服务的例子。

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

JSON载荷:

{
    "timeout_length": 15000
}

API响应(15秒后):

{
    "response": "ok"
}

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