人为地创建连接超时错误

Mar*_*ram 270 connection networking network-programming tcp

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

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

编辑:

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

WSAEINVAL(10022)参数无效

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

小智 411

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

  • ...并且因为从单元测试向其他人的服务器发送随机数据包是粗鲁的. (132认同)
  • 这并不总是有效.例如,使用Python的`urllib`,这将返回'No route to host'异常.FYI (13认同)
  • 同上,我想这是一个更好的答案,因为google.com:81可能有一天可以访问. (12认同)
  • 10.0.0.0,10.255.255.255,172.16.0.0,172.31.255.255,192.168.0.0,192.168.255.255所有这些都是不可路由的. (7认同)
  • @FHI提到的"无主机路由"错误通常出现在两个条件中:(a)当您尝试连接到本地LAN中的不可访问主机时(意味着它不响应ARP查询,因此它基本上是" ARP超时").并且(b)当路由器返回相应的ICMP错误时.如果您与您测试的专用IP位于同一子网中,则会出现第一种情况.第二种情况,如果路由器不知道如何将数据包路由到其目的地,但在某些情况下,它们只丢弃数据包而不发送ICMP错误. (4认同)
  • 在Java中你得到"连接超时" (2认同)
  • 这是一个优雅的解决方案.打击其他人/公司的服务器进行测试是非常粗鲁的,就像你不喜欢有人测试他们的电话系统的错误号码一样. (2认同)
  • 在 java8 你得到 java.net.NoRouteToHostException: No route to host (2认同)

Ale*_*der 279

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

  • 这个答案很简单,就像@ emu的答案一样.我理解这个答案并不打算建议使用google.com:81,但这里的要点是使用被阻止的其他端口.所以你总是可以使用<your-own-ip>:<blocked-port>. (6认同)
  • 除非是你自己的服务器,否则很难打到其他服务器进行测试.通过点击不可路由的IP地址(如10.255.255.1)或使用您自己的虚拟服务器进行测试,使用类似下面提到的emu的文明解决方案. (6认同)
  • 我认为谷歌可能已经封锁了这个端口.当我使用Chrome测试时,我只是"服务器不可用".当我在下面使用@ emu的技巧时,连接会按预期挂起.我错过了什么吗? (2认同)
  • 这会给连接拒绝不超时. (2认同)

Tom*_*ain 40

如果您使用的是unix机器,则可以使用netcat启动端口监听:

nc -l 8099
Run Code Online (Sandbox Code Playgroud)

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

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

  • 要在套接字级别测试连接超时,请使用`kill -STOP <pid>`冻结nc进程(或者只使用CTRL-Z而不放入后台).系统将像服务器正在运行一样,但等待服务器接受连接,从而导致连接超时(错误110). (7认同)
  • 它很有用,因为您可以看到应用程序正在推送的任何数据。您可以检查您的应用程序是否要求回复。 (2认同)

spe*_*ane 22

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

http://example.com:81

使用example.com:81是对Alexander的答案的改进,因为example.com是由DNS标准保留的,所以它总是无法访问,不像google.com:81,如果谷歌感觉它可能会改变.此外,由于example.com定义为无法访问,因此您不会充斥Google的服务器.

我会说它比@ emu的答案有所改进,因为它更容易记住.

  • 目前,我看到“ example.com”解析为93.184.216.34,并且实际上提供了一个简短的HTML来解释这是一个示例域...端口81仍然没有响应。 (2认同)
  • @speedplane IANA 根据规定拥有该域名,并维护一个网络服务器,提供一个解释“example.com”用途的网页。域名背后有基础设施,因此每个请求都会花费 IANA 的钱。RFC 2606 和 RFC 6761 中引用了允许的使用,您不能自由地将域用于您喜欢的任何目的,例如“淹没”它们而不是另一台服务器,正如您提到的那样。您声称“example.com 被定义为无法访问”的说法是不正确的,它是可以访问的。81端口现在不可达,但是将来在哪里定义来保证呢? (2认同)

Hen*_*ger 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()
Run Code Online (Sandbox Code Playgroud)

现在它等待传入连接.连接您想要测试的任何内容localhost:9000.当你这样做时,Python将接受连接并accept()返回它.除非你通过它发送任何数据clientsocket,否则调用者的套接字应该在下一个时间超时recv().

  • 我能够将监听和接受部分放在一个“while True:”循环中,这似乎是一个很好的持久超时目标来进行测试。 (2认同)
  • 它可以工作,但是会出现“读取超时”错误,与“连接超时”不同 (2认同)

raj*_*_kw 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

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

  • (正如我对接受的答案所做的评论一样)当我在Node.js中测试XMLHttpRequest时,与`10.0.0.0`和`10.255.255.255`的连接会引发EACCES错误,而不是超时。但是,10.255.255.1、172.16.0.0、172.31.255.255、192.168.0.0和192.168.255.255超时。 (2认同)

ame*_*hes 9

我想指出每个人都注意道路

使用配置(取自他们的示例),200:b@100:dr您将获得随机丢弃的连接.

  • 与超时不同 (2认同)
  • 我想指出的是,@zb226 的编辑在这种情况下并没有_真正_有帮助。虽然 Pathod(我七年前推荐的)现在确实是 mitmproxy 的一部分,但这篇文章以目前的形式毫无意义。我找不到有关如何使用 mitmproxy 实现类似功能的文档,因此我将这条评论留给任何想知道它应该如何工作的人。 (2认同)

小智 8

软件解决方案怎么样:

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


小智 5

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

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


And*_*ity 5

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

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

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

  • 这正是我一直在寻找的。服务很好,会添加到我的书签中 (5认同)