Detecter une application server sur le reseau local
Detecter une application server sur le reseau local
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
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
Re: Detecter une application server sur le reseau local
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
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

Re: Detecter une application server sur le reseau local
Super ton code m'intéresse !!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

Re: Detecter une application server sur le reseau local
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.
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
Re: Detecter une application server sur le reseau local
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 !
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 !
Re: Detecter une application server sur le reseau local
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.
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.

Re: Detecter une application server sur le reseau local
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 ?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.
J'attends ton code ! Merci beaucoup !
Re: Detecter une application server sur le reseau local
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
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

Re: Detecter une application server sur le reseau local
Excelent ! j'attend de voir ça ! Tu sais comment récupérer le masque de sous réseau utilisé ou pas ?
Re: Detecter une application server sur le reseau local
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"...
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"...
- Le psychopathe
- Messages : 764
- Inscription : jeu. 03/mars/2005 19:23
Re: Detecter une application server sur le reseau local
Tu cherches à trouver un serveur écrit en PB ?
Re: Detecter une application server sur le reseau local
yes !Le psychopathe a écrit :Tu cherches à trouver un serveur écrit en PB ?

Re: Detecter une application server sur le reseau local
Ç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.

Je vais utiliser ça pour l'instant.
Re: Detecter une application server sur le reseau local
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!
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!
Re: Detecter une application server sur le reseau local
Je pars du boulot, je dois cuisiner un peu et ensuite je m'y remets. 
