Problema com InetAddress.getByName() e linux [resolvido]

Olá pessoal,

Estou implementando um sistema que conta com uma classe de comunicação TCP/IP. Utilizo a classe Socket para realizar a conexão com o ip destino, porém surgiu um problema. Quando tento conectar no ip destino e ele não está disponível na rede, o construtor da classe Socket demora muito tempo para dar um timeout (cerca de 30 segundos).

socket = new Socket(host, port);

Não vi nenhum jeito de setar um timeout no construtor e não queria construir uma thread paralela ou algo do gênero para controlar o timeout. Pesquisei um pouco no google e encontrei a classe InetAddress, que fornece um método de “ping”: isReachable(). Fiz a implementação do método e ficou assim:

log.debug("Enviando ping para conectar");
if (InetAddress.getByName(host).isReachable(timeout)) {
    log.debug("Ok, existe na rede. Conectando...");
    socket = new Socket(host, port);
}

Maravilha, funcionou!
Mas a vida, a vida é uma caixinha de surpresas. Eu fui para o Linux e tentei executar o programa para testar, porém não funcionou. Então pesquisei mais um pouco e encontrei esse link: http://blog.taragana.com/index.php/archive/how-to-do-icmp-ping-in-java-jdk-15-and-above/
Logo no final do texto:

Ou seja, preciso executar o programa como administrador para funcionar. O projeto é uma biblioteca de integração, portanto, não posso garantir que a pessoa que vá implementar o programa dela sempre se lembre de executar como admin…

Alguém tem uma sugestão?

Antecipadamente grato

o/

Em vez de new Socket (host, port), use new Socket () (sem parâmetros), e use o método connect que tem 2 parâmetros (o segundo é o timeout).

http://java.sun.com/javase/6/docs/api/java/net/Socket.html#connect(java.net.SocketAddress,%20int)

[quote=entanglement]Em vez de new Socket (host, port), use new Socket () (sem parâmetros), e use o método connect que tem 2 parâmetros (o segundo é o timeout).

http://java.sun.com/javase/6/docs/api/java/net/Socket.html#connect(java.net.SocketAddress,%20int)[/quote]
…e caso um SocketTimeoutException seja lançado você sabe que não foi possível conectar.

entanglement, marcobiscaro2112
Obrigado aos dois!!

Estava tudo escuro e vocês me mostraram o caminho :smiley:

public boolean connect(String host, int port, int timeout) {
        try {
            this.host = host;
            this.port = port;            
            log.debug("Conectando...");
            socket = new Socket();  //criando socket
            InetSocketAddress insa = new InetSocketAddress(host, port);  //atribuindo endereço
            socket.connect(insa, timeout);  //conectando com timeout desejado
            connected = true;
            return true;
        } catch (SocketTimeoutException e) {            
            log.error(e);  //falha de conexão... 
        } catch (IOException e) {
            log.error(e);
        }
        return false;
    }

Forte abraço
o//