在任何机器上找到连接限制的强大方法

时间:2013-06-29 10:12:51

标签: java connection port netty limits

我需要找出当前机器与远程主机的连接的近似限制,理想情况下它应该适用于任何带有java的操作系统。 在大规模连接到远程主机时达到连接限制,并且在这种情况下取​​决于操作系统,获取BindException或ConnectException或SocketException。

我认为没有确切的方法可以获得此限制,因为它取决于当前的网络活动和操作系统设置(例如ulimit),所以我试图找到一种强大的经验方法。

目前我正以最高速率打开连接(每1微秒,如果更少 - 我得到一个VM InternalError),直到我得到异常然后计算速率为:number of connections so far / duration,我使用Netty,这里,这里是代码,主循环:

while (!Thread.currentThread().isInterrupted() && !stop) {
        try {
            ChannelFuture future = bootstrap.connect(addr);
            connected.incrementAndGet();
        } catch (ChannelException e) {
            if (e.getCause() instanceof SocketException) {
                stop = handleLimitErrors(e.getCause());
            }
        }

        TimeUnit.MICROSECONDS.sleep(1);
    }

netty渠道处理程序:

private class ErrorHandler extends SimpleChannelUpstreamHandler {
    @Override
    public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
        e.getChannel().close();
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception {
        Throwable exc = e.getCause();
        e.getChannel().close();

        if (exc instanceof BindException || exc instanceof ConnectException) {
            stop = handleLimitErrors(exc);
        }
    }
}

和反击:

private boolean handleLimitErrors(Throwable e) {
    return  (errors.incrementAndGet() > 10);
}

>>> Full code here

有更好/更强大的方式吗? 我将至少在任何主要操作系统(Linux / MacOS / Win)上使用它。

1 个答案:

答案 0 :(得分:0)

我知道你是对的 - 没有确切的方法。这取决于(另一个)机器设置,它是你无法控制的。您提供的方式是关于如何测试另一台机器的连接限制的更多方法。快乐的黑客行为: - )