Ping Pong Connection

Problema que estou tendo e o seguinte:

Eu tenho uma lista de ips, em um array, neste array,
todos ips podem estar online, todos podem estar offline
ou alguns offline e outros online ok?
Estou fazendo um trecho de codigo, que conecta no ip, e na porta
especifica, se tiver, online me retorna, pong, senao, cai nas exceptions
e me determina o porque de nao esta conectando, e assim eu nao retorno
o pong. Mais veja o seguinte, como e um laco infinito, quando o ip
está online, ele interage rapidamente sobre esse ip e a porta, umas 20 vezes,
so que quando vai conectar na 21 vez, da Connection timed out: connect
como se fosse, mass atack …
E quando o ip nao existe cai na exception unkownexception certo?
So que demora, a dar a excecao, tem algum meio de aprimorar esse
codigo, so conectando e retornando rapidamente se o determinado
ip esta online, ou nao? sem demorar? Usar threads?

Alguem tem uma forma melhor de implementar isso?

import java.io.IOException; 
import java.net.Socket; 
import java.net.UnknownHostException; 

public class PingPong { 
   public static void main(String[] args) { 
        Socket Socket = null; 
      String[] ipsValidos = { "200.111.255.236", "200.156.159.6"}; 
      int valor = 0; 
      boolean loop = true; 

      while (loop) { 
         try { 
                 if (ipsValidos.length == valor) valor = 0; 
            Socket = new Socket(ipsValidos[valor], 1000); 
            if (Socket.getSoTimeout() == 0) Socket.setSoTimeout(1); 
         } catch (UnknownHostException socketException) { 
             System.err.println(socketException.getMessage()); 
         } catch (IOException socketException) { 
            System.err.println(socketException.getMessage()); 
         } 
                 valor++; 
      } 
   } 
} 

Fazer isso multi-thread é lei.

Se a porta estiver fechada ele da connection refused. Time out pode ser por várias razões mas w/e pra vc seria o mesmo que offline.

E pra não parecer d.o.s. da um tempo antes de cada requisição pra aquela porta.

[quote=Flin]Fazer isso multi-thread é lei.

Se a porta estiver fechada ele da connection refused. Time out pode ser por várias razões mas w/e pra vc seria o mesmo que offline.

E pra não parecer d.o.s. da um tempo antes de cada requisição pra aquela porta.[/quote]

é trankilo usar m-thread certo?
o tempo que voce fala e para cada requisicao?
tipo um sleep? na thread, antes de dar o ping?

Como seria a forma de implementar?
Alguem tem outra opniao sobre o assunto?

Para evitar problemas (já que você só quer ver se o IP está on ou offline: )

a) É interessante dar um tempo após cada conexão e cada desconexão. (Veja com “netstat -an” se há muitos sockets em “TIME_WAIT” ou “CLOSE_WAIT” depois que você faz um teste desses…)
O protocolo TCP não gosta muito de conexões e desconexões repetidas, tanto é que o seu browser normalmente usa um modo “keep-alive” para conectar-se ao web server (ou seja, ele tenta sempre reaproveitar a conexão TCP/IP para cada requisição HTTP, em vez de ficar abrindo e fechando a conexão a cada figura ou página obtida).

b) Esse é realmente o tipo de coisa que é legal fazer com “worker threads”.

c) No Java 5.0 existe agora uma API que é mais ou menos um “ping” (java.net.InetAddress.isReachable). Ele faz exatamente um “ping” (ICMP ECHO) se o usuário corrente puder executar o “ping”, ou tenta conectar-se à porta TCP 7 (ECHO) se o usuário corrente não tiver permissões suficientes.

public boolean isReachable(int timeout)
throws IOExceptionTest whether that address is reachable. Best effort is made by the implementation to try to reach the host, but firewalls and server configuration may block requests resulting in a unreachable status while some specific ports may be accessible. A typical implementation will use ICMP ECHO REQUESTs if the privilege can be obtained, otherwise it will try to establish a TCP connection on port 7 (Echo) of the destination host.
The timeout value, in milliseconds, indicates the maximum amount of time the try should take. If the operation times out before getting an answer, the host is deemed unreachable. A negative value will result in an IllegalArgumentException being thrown.

[quote=thingol]Para evitar problemas (já que você só quer ver se o IP está on ou offline: )

a) É interessante dar um tempo após cada conexão e cada desconexão. (Veja com “netstat -an” se há muitos sockets em “TIME_WAIT” ou “CLOSE_WAIT” depois que você faz um teste desses…)
O protocolo TCP não gosta muito de conexões e desconexões repetidas, tanto é que o seu browser normalmente usa um modo “keep-alive” para conectar-se ao web server (ou seja, ele tenta sempre reaproveitar a conexão TCP/IP para cada requisição HTTP, em vez de ficar abrindo e fechando a conexão a cada figura ou página obtida).

b) Esse é realmente o tipo de coisa que é legal fazer com “worker threads”.

c) No Java 5.0 existe agora uma API que é mais ou menos um “ping” (java.net.InetAddress.isReachable). Ele faz exatamente um “ping” (ICMP ECHO) se o usuário corrente puder executar o “ping”, ou tenta conectar-se à porta TCP 7 (ECHO) se o usuário corrente não tiver permissões suficientes.

public boolean isReachable(int timeout)
throws IOExceptionTest whether that address is reachable. Best effort is made by the implementation to try to reach the host, but firewalls and server configuration may block requests resulting in a unreachable status while some specific ports may be accessible. A typical implementation will use ICMP ECHO REQUESTs if the privilege can be obtained, otherwise it will try to establish a TCP connection on port 7 (Echo) of the destination host.
The timeout value, in milliseconds, indicates the maximum amount of time the try should take. If the operation times out before getting an answer, the host is deemed unreachable. A negative value will result in an IllegalArgumentException being thrown.
[/quote]

Tranquilo, amigo, se o ip que estou tentando pingar tiver um firewall??
Como ficaria?

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5061568

Veja, se e isso que voce quer falar?

Olá

Se o IP que vc quer pingar tiver um firewall que impeça o ping então você NÃO conseguirá fazer ping de jeito nenhum. Isto não é Java e sim TCP/IP.

[]s
Luca

Mais o meu problema e o seguinte, setar um timeout para conectar saka. do modo que eu estou falando ta demorando a conectar e lancar
a exception entendeu. teria como fazer isso?

:cry:

Acho que solucionei o problema vejam?

O problema e seguinte setar o timeout depois que o socket foi criado e estabelecido a conexao! esse era o erro!

O que fiz foi o seguinte, setar o timeout do socket antes de conectar!
Dessa forma, basta estabelecer, quantos milisegundos ou segundos
que o socket tem para poder lancar a exception.

Vejam o codigo:

int connectTimeoutMs = 1000;
Socket sock = new Socket();
InetSocketAddress addr = new InetSocketAddress(ipsValidos[valor], 7000 );
sock.connect( addr , connectTimeoutMs );

Funciona? :slight_smile: :slight_smile: