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/