[Java] [DEFI] Voir les partie de quake en cours....

Voir les partie de quake en cours.... [Java] [DEFI] - Java - Programmation

Marsh Posté le 13-11-2003 à 09:06:23    

Bonjour,
 
Je vous savoir comment font la plus part des jeux multi-joueur lors que l'on entre dans la parti LAN.....
Je voudrais realiser comme eux un tablo dans serveur en cours (ici quake3 en l'occurence) mais pas seulement sur le port 27960...
 
En multicast je devrait envoyé un paquet par port que je supposerai possible d'herbergé un server...
 
Si par exemple mes ports s'entendent de 25000 à 30000... 5000 (par machine) packet c qd meme bcp!
 
Je m'etais mis en tete que lorsque q3 se lancer il ne lancé pas un port mais 2! L autre serait en fait un ptit gars qui dit(a interval regulier ou sont reponse d'un packet spécifique) quel sont les autres ports utiliser par q3 sur ce pc.
 
Le probleme est (si mon hyp est vrai) "quel est ce port?" et "quel packet lui envoyé???"
 
ps: ma question releve du defi je pense car g eplucher le net a  la recherche de ce port

Reply

Marsh Posté le 13-11-2003 à 09:06:23   

Reply

Marsh Posté le 13-11-2003 à 09:10:13    

tu ouvres un shell
tu fais un netstat -a > sans_q3.txt
tu lances une partie de q3  
tu fais un netstat -a > avec_q3.txt
 
tu compares [:spamafote]


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 13-11-2003 à 09:25:40    

je vais essayer merci

Reply

Marsh Posté le 13-11-2003 à 09:29:30    

bon bah apparemment mon hyp est fausse...
 
je vois pas comment le jeu peu trouver les server sur son reseaux
 
quelqu'un a une idee???

Reply

Marsh Posté le 13-11-2003 à 09:36:20    

c'est peut être les serveurs eux même qui signalent leur présence ...


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 13-11-2003 à 09:45:27    

la question c pas quel moyen et comment ils sauraient a ki se signaler

Reply

Marsh Posté le 13-11-2003 à 10:26:20    

multicast udp sur le réseau local peut être [:spamafote]


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 13-11-2003 à 11:10:30    

Ça se trouve, le réseau n'intervient pas. Il y aurait une communication inter-processus, tout simplement.


---------------
"Colère et intolérance sont les ennemis d'une bonne compréhension." Gandhi
Reply

Marsh Posté le 13-11-2003 à 11:14:57    

Krueger a écrit :

Ça se trouve, le réseau n'intervient pas. Il y aurait une communication inter-processus, tout simplement.


 
il faut bien que ça passe par un port reseau  [:spamafote]


---------------
IVG en france
Reply

Marsh Posté le 14-11-2003 à 09:55:06    

Alors,  
Du nouveau!
 
J'ai scanné les ports entre 27000 et 29999 ....
enfin voila le code...

Code :
  1. import java.net.*;
  2. import java.util.*;
  3. import java.io.IOException;
  4. public class Scanner extends Thread
  5. {
  6. protected static InetAddress ipClient;
  7. protected static MulticastSocket mcastSocket;
  8. protected static HashMap listeServers = new HashMap();
  9. protected int portMin = 27000;
  10. protected int portMax = 29999;
  11. protected static byte[] data;
  12. private boolean ecouteur = false;
  13. private int portCourant;
  14. public Scanner()
  15. {
  16.  try
  17.  {
  18.   ipClient = InetAddress.getLocalHost();
  19.  }
  20.  catch(UnknownHostException uhe)
  21.  {}
  22.  try
  23.  {
  24.   mcastSocket = new MulticastSocket();
  25.  }
  26.  catch(IOException ioe)
  27.  {}
  28.  connecter();
  29.  construireData();
  30. }
  31. public Scanner(int port)
  32. {
  33.  portCourant = port;
  34.  start();
  35. }
  36. public Scanner(boolean estUnEcouteur)
  37. {
  38.  ecouteur = estUnEcouteur;
  39.  start();
  40. }
  41. public void run()
  42. {
  43.  if (!ecouteur)
  44.  {
  45.   DatagramPacket packetUDP = new DatagramPacket(data, data.length, ipClient, portCourant);
  46.   try
  47.   {
  48.    mcastSocket.send(packetUDP);
  49.   }
  50.   catch ( java.io.IOException ioe)
  51.   {
  52.    return;
  53.   }
  54.  }
  55.  else
  56.  {
  57.   byte[] tmp = new byte[61440];
  58.   DatagramPacket packetUDPRecu = new DatagramPacket(tmp, tmp.length);
  59.   try
  60.   {
  61.    mcastSocket.receive(packetUDPRecu);
  62.   }
  63.   catch(IOException ioe)
  64.   {}
  65.   new Scanner(true);
  66.   //tmp = new byte[PacketUDPRecu.getLength()]
  67.   tmp = packetUDPRecu.getData();
  68.   listeServers.put(packetUDPRecu.getSocketAddress(), packetUDPRecu.getData());
  69.   String res = "";
  70.   for (int i = 4; i < packetUDPRecu.getLength(); i++)  //les 4 premiers sont aussi egaux a -1
  71.    res += (char)tmp[i];
  72.   System.out.println(res);
  73.  }
  74. }
  75. protected void connecter()
  76. {
  77.  try
  78.  {
  79.   mcastSocket.joinGroup(ipClient);
  80.  }
  81.  catch(IOException ioe)
  82.  {}
  83. }
  84. protected void deconnecter()
  85. {
  86.  try
  87.  {
  88.   mcastSocket.leaveGroup(ipClient);
  89.  }
  90.  catch(IOException ioe)
  91.  {}
  92. }
  93. public void scan()
  94. {
  95.  scan(portMin, portMax);
  96. }
  97. private void construireData()
  98. {
  99.  String tmp = "1111" + " getstatus";
  100.     data = tmp.getBytes();
  101.  for (int i = 0; i < 4; i++)
  102.   data[i] = (byte)0xff; //c'est -1 en hexa
  103. }
  104. public void scan (int min, int max)
  105. {
  106.  new Scanner(true);
  107.  for (int i = min; i < max; i++)
  108.   new Scanner(i);
  109. }
  110. }


 
et puis tout simplement ...
 

Code :
  1. public class TestScanner
  2. {
  3. public static void main(String[] argv)
  4. {
  5.  Scanner scanner = new Scanner();
  6.  scanner.scan();
  7. }
  8. }


 
enfin voila quoi ...
Le bon coté c que ca trouve les serveur en 1/2 sec...
Le mauvais ca ne trouve que les servers dont les ip ont join le groupe (dont le client de l'appli seulement) mais pas les autres ip (autres pc) ou se trouve les autres servers quake3 eventuels
 
enfin bref... le schmilblick avance mais et loin d'etre resolu...
 
Merci de m'aider
 
:jap:

Reply

Marsh Posté le 14-11-2003 à 09:55:06   

Reply

Marsh Posté le 14-11-2003 à 13:59:31    

Le menu réseau local du menu multijoueur de Half-Life détecte les parties visibles. As-tu essayé d'analyser le trafic réseau généré lors cette détection ?


---------------
"Colère et intolérance sont les ennemis d'une bonne compréhension." Gandhi
Reply

Marsh Posté le 14-11-2003 à 16:02:57    

arf... tu me crois si je te dis k je n'encaisse plus du tout HL ???
Mais non je n'ai pas essayé...
Si qq pouvais... pour moi  
Merci

Reply

Marsh Posté le 19-11-2003 à 14:18:15    

j'ai trouvé la solution....
 
merci encore a tous pour  vos tentative ....
 
à titre d'info :)
 

Code :
  1. import java.net.InetAddress;
  2. import java.net.MulticastSocket;
  3. import java.net.UnknownHostException;
  4. import java.io.IOException;
  5. import java.net.DatagramPacket;
  6. import java.net.InetSocketAddress;
  7. import java.util.StringTokenizer;
  8. import java.util.HashMap;
  9. public class Scanner extends Thread
  10. {
  11. protected static InetAddress  ipMaskClient;   /** IP du masque de reseaux de l'hote */
  12. protected static MulticastSocket mcastSocket;   /** La socket par laquelle le réseaux entier sera atteint */
  13. protected    int    portMin = 27000;  /** Port minimum a scanner (arbitraire) */
  14. protected   int    portMax = 29999;  /** Port maximum a scanner (arbitraire) */
  15. protected static byte[]    data;     /** Le paquet a envoyé */
  16. private    int    portCourant;   /** Le port a scanner */
  17. protected static  HashMap listeServers = new HashMap(); /** La liste des servers trouvé sur le réseau */
  18. /**
  19.  * Construit un Scanner qui abonne le masque du reseau à la multicastSocket
  20.  */
  21. public Scanner()
  22. {
  23.  try
  24.  {
  25.   ipMaskClient = InetAddress.getLocalHost();
  26.  }
  27.  catch(UnknownHostException uhe)
  28.  {}
  29.  try
  30.  {
  31.   mcastSocket = new MulticastSocket();
  32.  }
  33.  catch(IOException ioe)
  34.  {}
  35.  try
  36.  {
  37.   mcastSocket.joinGroup(ipMaskClient);
  38.  }
  39.  catch(IOException ioe)
  40.  {}
  41.  String tmp = "1111" + " getinfo";
  42.     data = tmp.getBytes();
  43.  for (int i = 0; i < 4; i++)
  44.   data[i] = (byte)0xff; //c'est -1 en hexa
  45.  setMask();
  46. }
  47. /**
  48.  * Construit differents Threads selon la valeur la valeur de i.
  49.  * Si i = -1, le Thread ecoutera la socket
  50.  * Sinon le Thread scannera le port i  
  51.  */
  52. private Scanner(int i)
  53. {
  54.  portCourant = i;
  55.  start();
  56. }
  57. /**
  58.  * Determine la classe du reseaux de l'hote
  59.  * @return String La classe du reseaux
  60.  */
  61. private String getClasseReseaux()
  62. {
  63.  byte[] adresse = ipMaskClient.getAddress();
  64.  int temp;
  65.  if (adresse[0] < 0)
  66.   temp  = 256 + adresse[0];
  67.  else
  68.   temp  = adresse[0];
  69.  if   (0  <= temp && temp <= 127) return "A";
  70.  else if (128 <= temp && temp <= 191) return "B";
  71.  else if (192 <= temp && temp <= 223) return "C";
  72.  else if (224 <= temp && temp <= 239) return "D";
  73.  else if (240 <= temp && temp <= 247) return "E";
  74.  else         return "?";
  75. }
  76. /**
  77.  * Determine le numéro de reseaux de l'hote
  78.  * ex: 192.168.10.1 retournera 192.168.10
  79.  * @return String Le numéro du réseau de l'hote
  80.  */
  81. private String getNumReseaux()
  82. {
  83.  byte[] adresse = ipMaskClient.getAddress();
  84.  int[] temp = new int[4];
  85.  for (int i = 0; i < 4; i++)
  86.   if (adresse[i] < 0)
  87.    temp[i] = 256 + adresse[i];
  88.   else
  89.    temp[i] = adresse[i];
  90.  /*Classe D est une addresse de diffusion et la classe E n'est pas utilisée*/
  91.  if   (getClasseReseaux().equals("A" )) return temp[0] + "";
  92.  else if (getClasseReseaux().equals("B" )) return temp[0] + "." + temp[1];
  93.  else if (getClasseReseaux().equals("C" )) return temp[0] + "." + temp[1] + "." + temp[2];
  94.  else          return "?";
  95. }
  96. /**
  97.  * Remplace l'ip de l'hote par l'ip de masque réseau
  98.  */
  99. private void setMask()
  100. {
  101.  try
  102.  {
  103.   if   (getClasseReseaux().equals("A" ))
  104.    ipMaskClient = InetAddress.getByName(getNumReseaux() + ".255.255.255" );
  105.   else if (getClasseReseaux().equals("B" ))
  106.    ipMaskClient = InetAddress.getByName(getNumReseaux() + ".255.255." );
  107.   else if (getClasseReseaux().equals("C" ))
  108.    ipMaskClient = InetAddress.getByName(getNumReseaux() + ".255" );
  109.  }
  110.  catch (UnknownHostException uhe)
  111.  {}
  112. }
  113. /**
  114.  * Scan pour trouver les servers quake3 entre portMin et portMax
  115.  */
  116. public void scan()
  117. {
  118.  scan(portMin, portMax);
  119. }
  120. /**
  121.  * Scan pour trouver les servers quake3 entre min et max
  122.  * @param min Le port minimum à scanner
  123.  * @param maw Le port maximum à scanner
  124.  */
  125. public void scan (int min, int max)
  126. {
  127.  new Scanner(-1);  //creer un ecouteur
  128.  for (int i = min; i < max; i++)
  129.   new Scanner(i); //creer un envoyeur
  130. }
  131. /**
  132.  * 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.
  133.  */
  134. public void run()
  135. {
  136.  if (portCourant != -1)
  137.  {
  138.   DatagramPacket packetUDP = new DatagramPacket(data, data.length, ipMaskClient, portCourant);
  139.   try
  140.   {
  141.    mcastSocket.send(packetUDP);
  142.   }
  143.   catch ( java.io.IOException ioe)
  144.   {
  145.    return;
  146.   }
  147.  }
  148.  else
  149.  {
  150.   byte[] tmp = new byte[61440];
  151.   DatagramPacket packetUDPRecu = new DatagramPacket(tmp, tmp.length);
  152.   try
  153.   {
  154.    mcastSocket.receive(packetUDPRecu);
  155.   }
  156.   catch(IOException ioe)
  157.   {}
  158.   new Scanner(-1); //creer le prochain ecouteur
  159.   tmp = packetUDPRecu.getData();
  160.   InetSocketAddress isa = (InetSocketAddress)(packetUDPRecu.getSocketAddress());
  161.   StringTokenizer temp = new StringTokenizer(isa.toString(), ":" );
  162.   String server = temp.nextToken();
  163.   server = server.substring(1, server.length());
  164.   String port = temp.nextToken();
  165.   Server serv = new Server(server, port);
  166.   String descriptif = "";
  167.   for (int i = 4; i < packetUDPRecu.getLength(); i++)  //les 4 premiers sont aussi egaux a -1
  168.    descriptif += (char)tmp[i];
  169.   listeServers.put(serv, descriptif);
  170.   System.out.println(server + " ~ " + port + "\n" + descriptif + "\n" );
  171.  }
  172. }
  173. /*----methodes de get----*/
  174. public HashMap getListeServers()
  175. { return listeServers; }
  176. }

Reply

Marsh Posté le 19-11-2003 à 17:17:25    

J'ai pas tout lu, mais à voir le début du code, ton programme va juste scanner certains ports de certains serveurs (lesquels ?), c'est ça ? Peux-tu en faire un petit résumé ?

Reply

Marsh Posté le 19-11-2003 à 18:24:14    

en fait ...
je recup l'ip du client mon appli (ex: 192.168.10.2)
je recup ensuite son mask de reseau (192.168.10.255)
 
J'abonne le mask a la multicast socket....
Je defini un eventails de port arbitraire a contacté mais une autre methode parametrée permet de redefinir cet eventail

Code :
  1. public void scan (int min, int max)


enfin bref...
Via la multicast socket j'arrose le reseau du client sur la tranche de ports definit. (à la recher des server q3)
Seul les server q3 me repondent et lorsqu'il le font je les stock  ds une HashMap avec leur descriptif...
 
:)
 
Ps: enfin bref on ne peut plus vraiment appeler ca un scanner puisque je n'ecoute po un port spé.
 

Reply

Marsh Posté le 19-11-2003 à 22:57:27    

:jap:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed