【发布时间】:2011-12-03 11:37:17
【问题描述】:
我最近正在调查一个 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 上)。如果我指定超时,它会更早地失败。
我需要修改的客户端属于另一个团队。我想向他们发送一个修复程序以及一个演示它的自动化测试。关于如何做到这一点的任何想法?
【问题讨论】: