■ Une idée de serveur de licence installer dans une entreprise.
- Un compteur de licence est initialisée.
- Un utilisateur se connecte et se voit attribuer une autorisation de licence si disponible.
- Un utilisateur se déconnecte, l'autorisation de licence est récupérée.
- Le serveur est arrêté, les applications sous licences en cours d’exécution sont fermées.
Code : Tout sélectionner
EnableExplicit
Global Title.s = "Licence Server"
;Network Setup
Global Port = 6833
Global ClientID
Global BufferSize = 1024, *Buffer = AllocateMemory(BufferSize), Buffer.s
;Licence
Global MaxLicence = 3
Global CountLicence = MaxLicence
;Map des utilisateurs connectés
;Pour chaque utilisateur, une autorisation d'utilisation est attribuée (#True) ou pas (#False)
Global NewMap Users()
Declare Start()
Declare ClearLog()
Declare Resize()
Declare Exit()
Start()
Procedure Start()
Protected ServerEvent, Result
If InitNetwork() = 0
MessageRequester("Information", "Impossible d'initialiser l'environement réseau", 0)
Exit()
EndIf
;Création du serveur
If CreateNetworkServer(0, Port)
OpenWindow(0, 0, 0, 800, 600, Title, #PB_Window_SystemMenu | #PB_Window_SizeGadget)
WindowBounds(0, 200, 100, #PB_Ignore, #PB_Ignore)
EditorGadget(0, 0, 0, 800, 560, #PB_Editor_ReadOnly)
AddGadgetItem(0, -1, FormatDate("%hh:%mm", Date()) + " | Server en écoute sur le port " + Port)
CheckBoxGadget(1, 10, 570, 200, 22, "Show Log")
SetGadgetState(1, #PB_Checkbox_Checked)
ButtonGadget(2, 700, 570, 80, 22, "Clear Log")
;Déclencheur / Trigger
BindGadgetEvent(2, @ClearLog())
BindEvent(#PB_Event_SizeWindow, @Resize())
BindEvent(#PB_Event_CloseWindow, @Exit())
Repeat
Repeat : Until WindowEvent() = 0
ServerEvent = NetworkServerEvent()
If ServerEvent
ClientID = EventClient()
Select ServerEvent
Case #PB_NetworkEvent_Connect
AddGadgetItem(0, -1, FormatDate("%hh:%mm", Date()) + " | Client " + Str(ClientID) + " se connecte")
Case #PB_NetworkEvent_Data
AddGadgetItem(0, -1, FormatDate("%hh:%mm", Date()) + " | Réception des données du client " + Str(ClientID) )
ReceiveNetworkData(ClientID, *Buffer, BufferSize)
Select LCase(PeekS(*Buffer, -1, #PB_UTF8))
Case "getlicence"
If CountLicence > 0
CountLicence - 1
Users(Str(ClientID)) = #True ;Une autorisation d'utilisation est délivrée
AddGadgetItem(0, -1, FormatDate("%hh:%mm", Date()) + " | Le client " + Str(ClientID) + " reçoit une licence.")
SendNetworkString(ClientID, "ReceiveLicence", #PB_UTF8)
AddGadgetItem(0, -1, FormatDate("%hh:%mm", Date()) + " | Nombre de licence disponible " + Str(CountLicence))
Else
Users(Str(ClientID)) = #False ;Pas d'authorisation d'utilisation
AddGadgetItem(0, -1, FormatDate("%hh:%mm", Date()) + " | Plus de licence disponible pour le client " + Str(ClientID))
SendNetworkString(ClientID, "NoLicence", #PB_UTF8)
EndIf
EndSelect
Case #PB_NetworkEvent_Disconnect
AddGadgetItem(0, -1, FormatDate("%hh:%mm", Date()) + " | Le client " + Str(ClientID) + " se déconnecte")
If CountLicence < MaxLicence And Users(Str(ClientID)) = #True
CountLicence + 1
EndIf
;Suppression de l'utilisateur
DeleteMapElement(Users(), Str(ClientID))
AddGadgetItem(0, -1, FormatDate("%hh:%mm", Date()) + " | Nombre de licence disponible " + Str(CountLicence))
EndSelect
Else
Delay(10) ; Ne pas saturer le CPU
EndIf
ForEver
CloseNetworkServer(0)
Else
MessageRequester("Information", "Impossible de créer le serveur de licence" + #CRLF$ + "le port est peut être utilisé ?", 0)
EndIf
EndProcedure
Procedure ClearLog()
ClearGadgetItems(0)
EndProcedure
Procedure Resize()
Protected Width = WindowWidth(0)
Protected Height = WindowHeight(0)
ResizeGadget(0, #PB_Ignore, #PB_Ignore, Width, Height-40)
ResizeGadget(1, #PB_Ignore, Height - 30, #PB_Ignore, #PB_Ignore)
ResizeGadget(2, Width - 100, Height - 30, #PB_Ignore, #PB_Ignore)
EndProcedure
;Sortie / Exit
Procedure Exit()
CloseNetworkServer(0)
End
EndProcedure