Detecter une application server sur le reseau local

Sujets variés concernant le développement en PureBasic
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Detecter une application server sur le reseau local

Message par Thyphoon »

J'ai certain jeu qui détecte automatiquement si une application server tourne sur une machine présente sur le reseau Local !
Savez vous comment on peut faire ça ?
Je voudrais simplifier le jeu en reseau et eviter que les personnes doivent chercher l'adresse IP du serveur !
Quelqu'un aurait il une idée ? j'ai chercher sur les différents forums, mais ou il n'y a rien ou bien j'ai pas les bon mot clef !

Merci
Thy
Cls
Messages : 620
Inscription : mer. 22/juin/2005 8:51
Localisation : Nantes

Re: Detecter une application server sur le reseau local

Message par Cls »

Tu peux faire cela en 2 passes :
1. tu ping tout le réseau local
2. tu vérifies si un port donnée est ouvert sur les machines ayant répondu au ping

A noter qu'il faut autoriser le ping sur le serveur, ce qui n'est pas toujours le cas (dans ce cas l'étape 1 est squizée et ça prend un peu plus de temps).

Si tu veux je dois avoir un code qui fait ça, je cherche et je reviens ;)
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Detecter une application server sur le reseau local

Message par Thyphoon »

Cls a écrit :Tu peux faire cela en 2 passes :
1. tu ping tout le réseau local
2. tu vérifies si un port donnée est ouvert sur les machines ayant répondu au ping

A noter qu'il faut autoriser le ping sur le serveur, ce qui n'est pas toujours le cas (dans ce cas l'étape 1 est squizée et ça prend un peu plus de temps).

Si tu veux je dois avoir un code qui fait ça, je cherche et je reviens ;)
Super ton code m'intéresse !! :)
Cls
Messages : 620
Inscription : mer. 22/juin/2005 8:51
Localisation : Nantes

Re: Detecter une application server sur le reseau local

Message par Cls »

Ce code ne répond pas à ton besoin mais il est facilement adaptable.
A la base, c'est un scanneur de port mais il peut tout à fait devenir un scanneur d'hôte (sur un port précis).

Je n'ai pas le temps de le modifier tout de suite mais je fais ça dès que possible, aujourd'hui j'espère.

Code : Tout sélectionner

; __________________________________________
Structure CONNECT_INFO
  host.s{100}
  port.l
  type.l ; TCP ou UDP  
EndStructure

Structure RUNNING_THREAD
  thread_id.l
  ms_debut.l
  host.s{100}
  port.l
EndStructure
; ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Global NewList TabThread.RUNNING_THREAD()


Global SEM_SCAN_CURRENT_THREAD
Global MAX_RUNNING_THREAD = 50
Global TIMEOUT = 150 ; en millisecondes


;-------------------  Semaphore Functions  ------------------------
Macro Sem_Create(Init, Max)
  CreateSemaphore_(#Null, Init, Max, #Null)
EndMacro
Macro Sem_Acquire(Sem)
  WaitForSingleObject_(Sem, #INFINITE)
EndMacro
Macro Sem_ReleaseSeveral(Sem, nb)
  ReleaseSemaphore_(Sem, nb, #Null)
EndMacro
Macro Sem_Release(Sem)
  ReleaseSemaphore_(Sem, 1, #Null)
EndMacro
;----------------  End of Semaphore Functions  ---------------------

Procedure connect_thread (connect_info_.l)
  
  Sem_Acquire(SEM_SCAN_CURRENT_THREAD)
  SCAN_CURRENT_THREAD + 1
  Sem_Release(SEM_SCAN_CURRENT_THREAD)
  
  *connect_info.CONNECT_INFO = connect_info_ 
  
  con = OpenNetworkConnection(*connect_info\host, *connect_info\port, *connect_info\type)

  If con
    
    Debug " -------------------------- > " + Str(*connect_info\port) + " is open !"    
    AddGadgetItem(ports, -1, Str(*connect_info\port) + Chr(10) + "Open")
    
    CloseNetworkConnection(con)
    
  EndIf
  
  FreeMemory(*connect_info)
  
  Global current_running_thread
  Sem_Acquire(SemCurrentThreadRunning)
  current_running_thread - 1
  Sem_Release(SemCurrentThreadRunning)
  
  Sem_Acquire(SEM_SCAN_CURRENT_THREAD)
  SCAN_CURRENT_THREAD - 1
  Sem_Release(SEM_SCAN_CURRENT_THREAD)
  
  ProcedureReturn 
  
EndProcedure


Procedure.l PortsOuvertsThread(ip.l)
  
  ClearGadgetItemList(ports)
  
  Sem_Acquire(SEM_SCAN_CURRENT_THREAD)
  SCAN_CURRENT_THREAD + 1
  Sem_Release(SEM_SCAN_CURRENT_THREAD)
  
  HOST.s = IPString(ip)
  
  For x = 1 To 1024

    struct = AllocateMemory(SizeOf(CONNECT_INFO))
    *connect_info.CONNECT_INFO = struct
  
    *connect_info\host = HOST
    *connect_info\port = x
    *connect_info\type = #PB_Network_TCP
    
    
    AddElement(TabThread())
    TabThread()\thread_id = CreateThread(@connect_thread(), *connect_info)
    TabThread()\ms_debut = ElapsedMilliseconds()
    TabThread()\host = HOST
    TabThread()\port = x
    
    ; Ajout un thread
    Sem_Acquire(SemCurrentThreadRunning)
    current_running_thread + 1
    Sem_Release(SemCurrentThreadRunning)
    
    ; Synchro
    While current_running_thread >= MAX_RUNNING_THREAD
      
      ; Vérifie qu'un ou plusieurs thread n'a pas dépassé le time out. Si c'est le cas  => on le supprime
      ForEach TabThread()
        
        If ElapsedMilliseconds() - TabThread()\ms_debut > TIMEOUT
          
          If IsThread(TabThread()\thread_id)
            
            PauseThread(TabThread()\thread_id)
            KillThread(TabThread()\thread_id)
            
            Sem_Acquire(SEM_SCAN_CURRENT_THREAD)
            SCAN_CURRENT_THREAD - 1
            Sem_Release(SEM_SCAN_CURRENT_THREAD)
            
            ;AddGadgetItem(ports, -1, Str(TabThread()\port) + Chr(10) + "Closed")
            Debug "Le port " + Str(TabThread()\port) + " ne répond pas sur " + TabThread()\host
            
            DeleteElement(TabThread())
          
          Else
            
            DeleteElement(TabThread())
          
          EndIf
            
            Sem_Acquire(SemCurrentThreadRunning)
            current_running_thread - 1
            Sem_Release(SemCurrentThreadRunning)
          
        EndIf
        
      Next
      
      Delay(50)
      
    Wend
    
    Delay(15)
    
  Next
  
  
  ; Attends jusqu'à ce que tous les thread se terminent
  While CountList(TabThread()) > 0
    
    ForEach TabThread()
        
        If ElapsedMilliseconds() - TabThread()\ms_debut > TIMEOUT
          
          If IsThread(TabThread()\thread_id)
            KillThread(TabThread()\thread_id)
            
            ;AddGadgetItem(ports, -1, Str(TabThread()\port) + Chr(10) + "Closed")
            Debug "Le port " + Str(TabThread()\port) + " ne répond pas sur " + TabThread()\host
          
          EndIf
          
          ; Suppression de l'élement
          DeleteElement(TabThread())  
            
          
          Sem_Acquire(SemCurrentThreadRunning)
          current_running_thread - 1
          Sem_Release(SemCurrentThreadRunning)
          
          Sem_Acquire(SEM_SCAN_CURRENT_THREAD)
          SCAN_CURRENT_THREAD - 1
          Sem_Release(SEM_SCAN_CURRENT_THREAD)
          
        EndIf
        
      Next
    
    Delay(05)
  Wend

  Sem_Acquire(SEM_SCAN_CURRENT_THREAD)
  SCAN_CURRENT_THREAD - 1
  Sem_Release(SEM_SCAN_CURRENT_THREAD)

EndProcedure
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Detecter une application server sur le reseau local

Message par Thyphoon »

Super Merci !

ton code est intéressant, mais je vois pas trop comment adapter ça a mon cas... là il faut connaitre l'adresse IP et il trouve le port !

Moi dans mon cas c'est l'inverse je connais le port faut trouver l'adresse IP.
Mais si tu as une idée je reste tout ouïe ! En tout cas merci pour ton intérêt !
Cls
Messages : 620
Inscription : mer. 22/juin/2005 8:51
Localisation : Nantes

Re: Detecter une application server sur le reseau local

Message par Cls »

Oui il manque un bout à ce code (et il y a un bout en trop). Dès que je peux, je le termine.

En gros, il manque le listing des adapters réseaux et la génération d'une liste de serveurs potentiels.
En trop, nous avons la boucle sur les numéros de port. ;)
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Detecter une application server sur le reseau local

Message par Thyphoon »

Cls a écrit :Oui il manque un bout à ce code (et il y a un bout en trop). Dès que je peux, je le termine.

En gros, il manque le listing des adapter réseaux et la génération d'une liste de serveurs potentiels.
En trop, nous avons la boucle sur les numéros de port. ;)
Merci c'est très sympa ! Dans le code que tu as posté ! il y a aussi moyen de remplacé les procédures de sémaphore part celle intégré au purebasic non ?
J'attends ton code ! Merci beaucoup !
Cls
Messages : 620
Inscription : mer. 22/juin/2005 8:51
Localisation : Nantes

Re: Detecter une application server sur le reseau local

Message par Cls »

J'ai trouvé un peu de temps, je suis en train de modifier mon code.

Je planche actuellement sur l'énumération des adresses IP en fonction du masque de sous réseau. En passant, si quelqu'un a une solution ça permettrait de gagner du temps ;)
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Detecter une application server sur le reseau local

Message par Thyphoon »

Excelent ! j'attend de voir ça ! Tu sais comment récupérer le masque de sous réseau utilisé ou pas ?
Cls
Messages : 620
Inscription : mer. 22/juin/2005 8:51
Localisation : Nantes

Re: Detecter une application server sur le reseau local

Message par Cls »

Oui aucun problème là dessus.

J'ai une adresse IP, un masque de sous réseau et je veux pouvoir taper dans n'importe quelle machine du réseau. Évidement sans faire un "for ip_champs_4 = 1 to 254"...
Avatar de l’utilisateur
Le psychopathe
Messages : 764
Inscription : jeu. 03/mars/2005 19:23

Re: Detecter une application server sur le reseau local

Message par Le psychopathe »

Tu cherches à trouver un serveur écrit en PB ?
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Detecter une application server sur le reseau local

Message par Thyphoon »

Le psychopathe a écrit :Tu cherches à trouver un serveur écrit en PB ?
yes ! :)
Cls
Messages : 620
Inscription : mer. 22/juin/2005 8:51
Localisation : Nantes

Re: Detecter une application server sur le reseau local

Message par Cls »

Ça tourne sur réseau microsoft ? Si oui, pas besoin de s'embêter avec le masque de sous - réseau et companie. Un petit NetServerEnum et le tour est joué ;)

Je vais utiliser ça pour l'instant.
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Detecter une application server sur le reseau local

Message par Thyphoon »

NetServerEnum je connais pas !
Actuellement mon jeu fonctionne que sous windows, mais j'espère avoir une version Linux et MacOsX plus tard !
Mais bon je verrais ça en temps et en heure ! Au pire pour les version Linux et MacOsX il faudra rentré l'IP du serveur.
Merci en tout cas CLs pour ce que tu fais!
Cls
Messages : 620
Inscription : mer. 22/juin/2005 8:51
Localisation : Nantes

Re: Detecter une application server sur le reseau local

Message par Cls »

Je pars du boulot, je dois cuisiner un peu et ensuite je m'y remets. ;)
Répondre