gpt4 book ai didi

java - 在 java 中测试 Socket#connect 超时

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:35:32 25 4
gpt4 key购买 nike

我最近正在调查 Java 应用程序的操作问题。有两个进程,processA 和 processB,运行在同一台主机上。

processA 与 processB 建立套接字连接。 processB 重新启动,但不知何故在重新启动后,所有来自 processA 的 Socket#connect 调用都被阻止(几分钟)。

我认为 processB 以某种方式使它的套接字处于损坏状态(接收 SYN 但从未响应)。问题自行解决(自动重启),因此我无法确定是否捕获到 TCP 流量。

我知道我们的套接字客户端在连接时应该有一个很短的超时时间(在这种情况下,操作系统默认值似乎很大)。

我只是好奇如何为我的套接字客户端编写一个失败的测试。

是否可以这样做:

@Test
public void testClientTimeoutOnConnectionAttempt() {
startBrokenSocketServer()
assertConnectionExceptionWithinOneSecond(myClient);
}

我想出了如何使用 ipfw 和 netcat 手动创建这些条件。

 sudo ipfw add 100 drop ip from 127.0.0.1 6969 to any
nc -l -p 6969

nc 在 6969 上监听,(防止 os 发送 rst,ack),ipfw 阻止我的 java 进程从 nc 接收任何 syn_ack。

在 Socket#connect 调用中没有任何超时,它在 SocketException 之前花费了 75 秒(在 mac os 上)。如果我指定超时,它会更早失败。

我需要修改的客户端属于另一个团队。我想向他们发送一个修复程序以及一个演示它的自动化测试。关于如何做到这一点有什么想法吗?

最佳答案

I was just curious about how to write a failing test for my socket client.

我认为这在 Java 中是不可能的。您当然可以模拟很多 netcat 的功能,但不能模拟 ipfw。我什至不确定它在 C 中是否可行,除非您执行一些非常特定于操作系统的内核调用。

我认为您可以从 Java 做的最好的事情就是连接到一个不存在的主机。您不能只尝试连接到本地网络上不存在的 IP,因为本地以太网硬件可能会更快地失败。您想要的是连接到您知道不存在的远程网络上的无效 IP。选择一个与您的本地网络不对应的 10-net 地址可能会起作用。

蹩脚的回答,但我没有立即看到任何其他方式。

关于java - 在 java 中测试 Socket#connect 超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8367373/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com