Partage
  • Partager sur Facebook
  • Partager sur Twitter

Requete Ping et timeout

Mettre un timeout sur ma requete ping...je n'y arrive pas :(

Sujet résolu
    17 juillet 2011 à 20:53:36

    Bonjour tout le monde, je vous expose mon soucis, qui sera surement un problème tout petit pour vous, mais vraiment dur dur pour moi...

    Alors voici ce que je veux faire : je veux lancer une requette ping sur un serveur ( IP + PORT sous la forme : 192.168.0.1:8080 par exemple ) et appliquer un timeout pour que la tentative de ping s'arrête si le serveur n'as toujours pas repondu au bout de X secondes ou millisecondes.

    Voila a quoi je suis arrivé pour le moment :

    int i = 1;
    
                    while(i==1)
    		{
    			try
    			{
                               //L'ip que je veux ping.
    			   String ip= "207.38.99.25";
                               //Sur le port.
    			   int port= 15100;
    			   new Socket(ip, port); 
    			   System.out.println("Login server OK");
    			}
    
    			catch(Exception e)
    			{
    			   System.out.println("Login server DOWN");
    			}
    
    		}
    


    Actuellement mon programme me renvoie les deux phrases "login server OK" et "login server DOWN" selon l'état du serveur, il fonctionne correctement.

    Seulement il met à peu près 5 secondes à afficher ce que je lui demande car je n'arrive pas à mettre un timeout, j'ai essayé tout ce que j'ai pu trouver sur le net, mais à chaque fois une erreur a laquelle je n'arrive pas à trouver de solution vient me bloquer (à cause de mon niveau qui n'est pas très élevé il faut dire).

    C'est donc dans un soucis d'optimisation que je me tourne vers vous, je voudrais s'il est possible qu'on m'aide a rajouter un timeout de disons 500ms pour que le programme soit plus réactif.

    Merci de votre aide!!!
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      17 juillet 2011 à 21:46:43

      Salut.

      Pour commencer, ce que tu réalises n'est en aucun cas un ping. Actuellement, tu ouvres un socket sur une addresse distante.

      Pour ce qui est du ping, il faut savoir que ICMP travaille au niveau 3 du modèle OSI. Les entetes TCP et UDP travaillent au niveau 4.
      Ce qui fait que les commandes ping (requetes ICMP) ne connaissent pas la notion de port.

      Pour plus d'informations sur l'entete ICMP, je te renvoie sur le site FrameIP. Et voici pour le modèle OSI.

      Sinon, pour ce qui est de ton problème, regarde du côté de la méthode isReachable(int) de la classe InetAddress

      Pour faire plus court, regarde cet exemple
      • Partager sur Facebook
      • Partager sur Twitter
        17 juillet 2011 à 21:52:15

        Coucou,

        Merci de ta réponse, j'ai déja essayé d'utiliser la méthode isReachable de la classe InetAddress, cependant je vais jeter un coup d'oeil au lien que tu m'as donné, et je te dis ce qu'il en est. ;)

        Merci dans tous les cas.

        Edit:

        Me revoila, après avoir regardé ton exemple puis une fois adapté a ma situation il semble que cela fonctionne, cependant j'ai quelques petites questions si cela ne t'embetes pas d'y répondre :

        1) Si j'ai bien compris je ne suis pas obligé de spécifier le port pour voir si le serveur est allumé, il me suffit de mettre l'IP, et dans le cas ou c'est "reachable" c'est qu'il est allumé ( et donc les ports devraient être disponibles logiquement ) ?

        2)
        try 
        		    {
        
        		      int timeout = 2000;
        		      InetAddress[] addresses = InetAddress.getAllByName("google.fr");
        		      
        		      for (InetAddress address : addresses) 
        		      {
        		        if (address.isReachable(timeout))
        		          System.out.printf("%s is reachable%n", address);
        		        else
        		          System.out.printf("%s could not be contacted%n", address);
        		      }
        		    } 
        		    catch (Exception e) 
        		    {
        		      System.out.printf("Unknown host: %s%n", "www.java2s.com");
        		    }
        		  }
        


        Si j'ai bien compris la variable addresses est un tableau de classe InetAddress?
        Dans le cas ou je dois effectuer le meme travail sur 2 - 3 adresses IP differentes, je dois proceder de quelle façon? Car je n'ai pas compris comment la synthaxe du "for" marchait...j'ai tout le temps vu des choses de la façon "for ( x = y ) etc..." mais la, j'ai pas tout compris..

        Merci encore de ton aide, ca m'a deja beaucoup fait avancer.
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          17 juillet 2011 à 23:29:21

          Re re.
          Alors, pour tes questions, je vais essayer d'y répondre

          1) Oui, dans le cas ou il est reachable, c'est qu'il est allumé. Je ne sais pas comment cette méthode détermine l'état de la machine se trouvant derrière l'addresse ip.
          Pour ce qui est des ports, je te dirais que non. La machine peut être atteignable, mais les ports qui t'intéressent peuvent être fermés (pas de nat/pat mis en place, firewall matériel ou logiciel bloquant les accès, ...).
          Il faut voir si tu peux déterminer "l'accessibilité" d'un port via un moyen ou un autre (le ping ne fonctionnera pas, car il travaille au niveau 3 du modèle OSI).

          2)
          try {
          	int timeout = 2000;
          	//Récuper toutes les addresses IP (v4) pointant sur le nom de domaine "google.fr"
          	//Et les stocker dans un tableau de InetAddress
          	InetAddress[] addresses = InetAddress.getAllByName("google.fr"); 
            
          	//Ceci est une boucle foreach (pour chaque), ce qui donnerait en version traduite :
          	//Pour chaque objet (auquel on assigne le nom "address") se trouvant dans le tableau "addresses" (qui est un tableau d'objets InetAddress)
          	for (InetAddress address : addresses) {
          		if (address.isReachable(timeout))
          			System.out.printf("%s is reachable%n", address);
          		else
          			System.out.printf("%s could not be contacted%n", address);
          		}
          	} 
          	catch (Exception e) {
          		System.out.printf("Unknown host: %s%n", "www.java2s.com");
          	}
          }
          

          Je t'ai légérement commenté le code, j'espère que cela t'aidera.

          Et pour ta dernière question, tu peux très bien faire quelque chose du genre
          List<InetAddress> addresses = new ArrayList<InetAddress>();
          InetAddress a = InetAddress.getByName("1.1.1.1");
          addresses.add(a);
          
          a = InetAddress.getByName("2.2.2.2");
          addresses.add(a);
          
          a = InetAddress.getByName("3.3.3.3");
          addresses.add(a);
          
          a = InetAddress.getByName("4.4.4.4");
          addresses.add(a);
          
          int timeout = 2000;	
          
          for (InetAddress address : addresses) {
          	if (address.isReachable(timeout))
          		System.out.printf("%s is reachable%n", address);
          	else
          		System.out.printf("%s could not be contacted%n", address);
          	}
          }
          


          Je te remets le lien vers la javadoc concernant la classe InetAddress.

          En espérant avoir répondu à toute tes questions ;)

          Edit : Et un lien concernant les boucles foreach
          • Partager sur Facebook
          • Partager sur Twitter
            18 juillet 2011 à 1:50:47

            Re coucou,

            Ben la..chapeau, j'ai tout compris !!
            Merci énormement !
            • Partager sur Facebook
            • Partager sur Twitter

            Requete Ping et timeout

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown