Networking 人为创建连接超时错误

Networking 人为创建连接超时错误,networking,network-programming,connection,tcp,Networking,Network Programming,Connection,Tcp,我在我们的软件中遇到了一个错误,当我收到连接超时时就会发生。这些错误非常罕见(通常是当我的连接被我们的内部网络中断时)。我怎样才能人为地产生这种效果,以便测试我们的软件 如果重要的话,应用程序是使用CAsyncSocket类用C++/MFC编写的 编辑: 我尝试使用不存在的主机,但发现套接字错误: WSAEINVAL(10022)无效参数 我的下一次尝试是使用的建议连接到另一个端口,例如81(在我自己的服务器上)。这很有效。与断开的连接完全相同(等待60秒,然后出错)。谢谢大家! 将网络电缆插入

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

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

编辑:

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

WSAEINVAL(10022)无效参数


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

将网络电缆插入没有其他连接/电缆的交换机。这应该是可行的。

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

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

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

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

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

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

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

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

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

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

    最简单的方法是使用


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

    您可以安装Microsoft环回驱动程序,该驱动程序将为您创建一个单独的接口。然后,您可以在它上连接到您(您自己的主机)的某些服务。然后,在网络连接中,您可以禁用/启用这样的接口…

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

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

    软件解决方案如何:


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

    您可以使用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()

    期间超时。我想提醒大家注意

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

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

    所有这些都是不可路由的

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

    nc -l 8099
    
    然后,修改服务以调用它通常对该端口执行的任何操作,例如


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

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

    对我来说最好的事情是静态路径可以是法力
    {
        "timeout_length": 15000
    }
    
    {
        "response": "ok"
    }
    
    ssh -L 12345:realserver.com:80 localhost
    
    ssh -L 12345:localhost:8080 localhost