3xc4l18ur question = ( to ) ? be : ! be; | j'ai trouvé la solution....
merci encore a tous pour vos tentative ....
à titre d'info
Code :
- import java.net.InetAddress;
- import java.net.MulticastSocket;
- import java.net.UnknownHostException;
- import java.io.IOException;
- import java.net.DatagramPacket;
- import java.net.InetSocketAddress;
- import java.util.StringTokenizer;
- import java.util.HashMap;
- public class Scanner extends Thread
- {
- protected static InetAddress ipMaskClient; /** IP du masque de reseaux de l'hote */
- protected static MulticastSocket mcastSocket; /** La socket par laquelle le réseaux entier sera atteint */
- protected int portMin = 27000; /** Port minimum a scanner (arbitraire) */
- protected int portMax = 29999; /** Port maximum a scanner (arbitraire) */
- protected static byte[] data; /** Le paquet a envoyé */
- private int portCourant; /** Le port a scanner */
- protected static HashMap listeServers = new HashMap(); /** La liste des servers trouvé sur le réseau */
- /**
- * Construit un Scanner qui abonne le masque du reseau à la multicastSocket
- */
- public Scanner()
- {
- try
- {
- ipMaskClient = InetAddress.getLocalHost();
- }
- catch(UnknownHostException uhe)
- {}
- try
- {
- mcastSocket = new MulticastSocket();
- }
- catch(IOException ioe)
- {}
- try
- {
- mcastSocket.joinGroup(ipMaskClient);
- }
- catch(IOException ioe)
- {}
- String tmp = "1111" + " getinfo";
- data = tmp.getBytes();
- for (int i = 0; i < 4; i++)
- data[i] = (byte)0xff; //c'est -1 en hexa
- setMask();
- }
- /**
- * Construit differents Threads selon la valeur la valeur de i.
- * Si i = -1, le Thread ecoutera la socket
- * Sinon le Thread scannera le port i
- */
- private Scanner(int i)
- {
- portCourant = i;
- start();
- }
- /**
- * Determine la classe du reseaux de l'hote
- * @return String La classe du reseaux
- */
- private String getClasseReseaux()
- {
- byte[] adresse = ipMaskClient.getAddress();
- int temp;
- if (adresse[0] < 0)
- temp = 256 + adresse[0];
- else
- temp = adresse[0];
- if (0 <= temp && temp <= 127) return "A";
- else if (128 <= temp && temp <= 191) return "B";
- else if (192 <= temp && temp <= 223) return "C";
- else if (224 <= temp && temp <= 239) return "D";
- else if (240 <= temp && temp <= 247) return "E";
- else return "?";
- }
- /**
- * Determine le numéro de reseaux de l'hote
- * ex: 192.168.10.1 retournera 192.168.10
- * @return String Le numéro du réseau de l'hote
- */
- private String getNumReseaux()
- {
- byte[] adresse = ipMaskClient.getAddress();
- int[] temp = new int[4];
- for (int i = 0; i < 4; i++)
- if (adresse[i] < 0)
- temp[i] = 256 + adresse[i];
- else
- temp[i] = adresse[i];
- /*Classe D est une addresse de diffusion et la classe E n'est pas utilisée*/
- if (getClasseReseaux().equals("A" )) return temp[0] + "";
- else if (getClasseReseaux().equals("B" )) return temp[0] + "." + temp[1];
- else if (getClasseReseaux().equals("C" )) return temp[0] + "." + temp[1] + "." + temp[2];
- else return "?";
- }
- /**
- * Remplace l'ip de l'hote par l'ip de masque réseau
- */
- private void setMask()
- {
- try
- {
- if (getClasseReseaux().equals("A" ))
- ipMaskClient = InetAddress.getByName(getNumReseaux() + ".255.255.255" );
- else if (getClasseReseaux().equals("B" ))
- ipMaskClient = InetAddress.getByName(getNumReseaux() + ".255.255." );
- else if (getClasseReseaux().equals("C" ))
- ipMaskClient = InetAddress.getByName(getNumReseaux() + ".255" );
- }
- catch (UnknownHostException uhe)
- {}
- }
- /**
- * Scan pour trouver les servers quake3 entre portMin et portMax
- */
- public void scan()
- {
- scan(portMin, portMax);
- }
- /**
- * Scan pour trouver les servers quake3 entre min et max
- * @param min Le port minimum à scanner
- * @param maw Le port maximum à scanner
- */
- public void scan (int min, int max)
- {
- new Scanner(-1); //creer un ecouteur
- for (int i = min; i < max; i++)
- new Scanner(i); //creer un envoyeur
- }
- /**
- * Definit l'action des différents Threads: s'il est envoyeur, il envoit :); sinon c'est qu'il ecoute alors lorsqu'il recoit quelquechose via la socket, il l'analysera puis ajoutera le server à la liste avec son descriptif.
- */
- public void run()
- {
- if (portCourant != -1)
- {
- DatagramPacket packetUDP = new DatagramPacket(data, data.length, ipMaskClient, portCourant);
- try
- {
- mcastSocket.send(packetUDP);
- }
- catch ( java.io.IOException ioe)
- {
- return;
- }
- }
- else
- {
- byte[] tmp = new byte[61440];
- DatagramPacket packetUDPRecu = new DatagramPacket(tmp, tmp.length);
- try
- {
- mcastSocket.receive(packetUDPRecu);
- }
- catch(IOException ioe)
- {}
- new Scanner(-1); //creer le prochain ecouteur
- tmp = packetUDPRecu.getData();
- InetSocketAddress isa = (InetSocketAddress)(packetUDPRecu.getSocketAddress());
- StringTokenizer temp = new StringTokenizer(isa.toString(), ":" );
- String server = temp.nextToken();
- server = server.substring(1, server.length());
- String port = temp.nextToken();
- Server serv = new Server(server, port);
- String descriptif = "";
- for (int i = 4; i < packetUDPRecu.getLength(); i++) //les 4 premiers sont aussi egaux a -1
- descriptif += (char)tmp[i];
- listeServers.put(serv, descriptif);
- System.out.println(server + " ~ " + port + "\n" + descriptif + "\n" );
- }
- }
- /*----methodes de get----*/
- public HashMap getListeServers()
- { return listeServers; }
- }
|
|