Bonjour, bonsoir,
je pense que le titre n'est pas bien explicite, voici la situation:
Je m'initie en ce moment, peu à peu avec le TCP. J'avoue que pour ce qui est de la fonctionnalité du "serveur", j'ai pris carrément pleins d'exemple que j'ai trouvé sur The Touche "F1". Cependant, j'ai un soucis:
Le projet:
Quelqu'un a besoin de mon aide pour pouvoir exécuter des programmes à distance sur son second PC. Je lui ai donc proposé mon aide et j'ai en fait fini le programme.
Le programme consiste à fermer, ouvrir ou relancer un, seul et unique programme sur son autre ordinateur. Ceci est composé donc d'un exécutable serveur à installer sur son PC contenant le programme et une application client qu'il doit garder tout le temps sur lui.
Problème:
Comme je l'ai dis plus haut, le programme est achevé mais je veux l'améliorer. Voilà concrètement ce que je veux faire:
- Lors de l'ouverture du client, le client dit à l'utilisateur si il s'est bien connecté au serveur.
- Lorsque le serveur réalise qu'UNE seule personne s'est connectée, il lui envoi une valeur précise qui dit soit que le programme est allumé, soit il est éteint.
- Le client analyse la valeur donnée, si elle équivaut a '8', donc grise le bouton "Fermer", si elle est équivaut à '9' on grise le bouton démarrer.
- Lorsque l'utilisateur appuie sur l'un des boutons proposés, il envoie une valeur spécifique au serveur.
- Lorsque le serveur reçoit la valeur '8', il ferme le programme, si il reçoit la valeur '9', on lance le programme et enfin, si il reçoit la valeur '10', on ferme le programme puis le relance.
- Lorsque le serveur a effectué ses actions, il envoi '8' si le programme s'est bien fermé, '9' si il s'est bien ouvert et '10' si il s'est bien relancé.
- On grise les boutons encore une fois selon la valeur reçu.
Voilà, vous comprendrez aisément que ce qui est barré sont les parties déjà programmées et fonctionnelles.
Code client;
► Afficher le texte
Code : Tout sélectionner
#cs ----------------------------------------------------------------------------
AutoIt Version : 3.3.6.1
Auteur:blacksoul305
Fonction du Script : Utilisation du TCP
Modèle de Script AutoIt.
#ce ----------------------------------------------------------------------------
; Début du script - Ajouter votre code ci-dessous.
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
$Form1 = GUICreate("Contrôle trololol à distance", 497, 200, 192, 124)
$Label1 = GUICtrlCreateLabel("lol à distance", 144, 16, 214, 27)
GUICtrlSetFont(-1, 12, 800, 4, "Comic Sans MS")
$Group1 = GUICtrlCreateGroup("Panneau de contrôle", 8, 72, 481, 113)
GUICtrlSetFont(-1, 8, 800, 2, "Comic Sans MS")
$closeServer = GUICtrlCreateButton("Fermer", 28, 112, 97, 41)
$startServer = GUICtrlCreateButton("Lancer", 208, 112, 89, 41)
$restartServer = GUICtrlCreateButton("Relancer", 368, 112, 89, 41)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUISetState(@SW_HIDE)
TCPStartup()
Local $serverAdress="5.16.149.222"
Local $port=3300
Local $recv
$socket=-1
$socket=TCPConnect($serverAdress,$port)
If @error Then
MsgBox(16,"Erreur de connexion","Erreur de connexion avec le serveur. Erreur n° "&@error&".")
Exit
Else
MsgBox(64,"Connexion réussie","Connexion au serveur réussie ; port: "&$port&" adresse IP: "&$serverAdress&".")
GUISetState(@SW_SHOW,$Form1)
EndIf
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $closeServer
TCPSend($socket,"8")
Case $startServer
TCPSend($socket,"9")
Case $restartServer
TCPSend($socket,"10")
EndSwitch
$recv = TCPRecv($socket,2048)
If $recv = '8' Then
MsgBox(64,"Info","Le programme a bien été fermé")
EndIf
WEnd
Code serveur;
► Afficher le texte
Code : Tout sélectionner
#cs ----------------------------------------------------------------------------
AutoIt Version : 3.3.6.1
Auteur:blacksoul305
Fonction du Script : Utilisation du TCP
Modèle de Script AutoIt.
#ce ----------------------------------------------------------------------------
; Début du script - Ajouter votre code ci-dessous.
Opt('MustDeclareVars', 1)
;==============================================
;==============================================
;SERVER!! Start Me First !!!!!!!!!!!!!!!
;==============================================
;==============================================
Local $path, $ProcessName, $nMsg, $chemin, $nom
$path = IniRead("server.ini","server","path","default")
$ProcessName = IniRead("server.ini","server","processname","default")
If $path ="default" Then
MsgBox(16,"Erreur","Le chemin de l'application n'est pas valide.")
ElseIf $ProcessName="default" Then
MsgBox(16,"Erreur","Le nom de processus n'est pas valide")
Else
Example()
EndIf
Func Example()
Local $szIPADDRESS = @IPAddress2
Local $nPORT = 3300
Local $MainSocket, $ConnectedSocket, $szIP_Accepted
Local $recv
TCPStartup()
$MainSocket = TCPListen($szIPADDRESS, $nPORT)
If $MainSocket = -1 Then Exit
$ConnectedSocket = -1
Do
$ConnectedSocket = TCPAccept($MainSocket)
Until $ConnectedSocket <> -1
$szIP_Accepted = SocketToIP($ConnectedSocket)
While 1
$recv = TCPRecv($ConnectedSocket, 2048)
If @error Then ExitLoop
If $recv = '8' Then ProcessClose($ProcessName)
If $recv = '9' Then Run($path)
If $recv = '10' Then
ProcessClose($ProcessName)
Run($path)
EndIf
WEnd
EndFunc ;==>Example
; Function to return IP Address from a connected socket.
;----------------------------------------------------------------------
Func SocketToIP($SHOCKET)
Local $sockaddr, $aRet
$sockaddr = DllStructCreate("short;ushort;uint;char[8]")
$aRet = DllCall("Ws2_32.dll", "int", "getpeername", "int", $SHOCKET, _
"ptr", DllStructGetPtr($sockaddr), "int*", DllStructGetSize($sockaddr))
If Not @error And $aRet[0] = 0 Then
$aRet = DllCall("Ws2_32.dll", "str", "inet_ntoa", "int", DllStructGetData($sockaddr, 3))
If Not @error Then $aRet = $aRet[0]
Else
$aRet = 0
EndIf
$sockaddr = 0
Return $aRet
EndFunc ;==>SocketToIP
Voilà, on devine très bien que la partie serveur, je ne l'ai vraiment pas codé, j'ai juste regroupé quelques exemples, et je ne serai pas contre que l'on m'explique. M'enfin, c'est optionnel, je veux juste vous attirer l'attention sur ceci:
Question:
J'ai une petite chose qui me tracasse, je fais référence à "conditions" dans mon titre. C'est justement cela, pour exprimer plusieurs conditions, j'ai été habitué a:
Code : Tout sélectionner
If ;condition à vérifier Then
;tu me fais cela
ElseIf ;sinon, si il y a cela Then
;tu fais ça
Else ;sinon
;tu me fais ça
Ce qui me choque ici c'est qu'il n'y ait pas de "ElseIf", en effet:
Code : Tout sélectionner
If @error Then ExitLoop
If $recv = '8' Then ProcessClose($ProcessName)
If $recv = '9' Then Run($path)
If $recv = '10' Then
Ce qui me pose problème, c'est que à cause de ça j'arrive pas à faire cela:
- Lorsque le serveur a effectué ses actions, il envoi '8' si le programme s'est bien fermé, '9' si il s'est bien ouvert et '10' si il s'est bien relancé.
Je peux pas faire rentrer une condition dans une condition.
J'ai essayé de faire ça avec un "Switch" de la variable "$recv", mais j'ai du redémarrer mon PC sauvagement haha !
Voilà, j'espère que vous serez en mesure de m'expliquer ce système de condition, et si cela vous fait penser "mais il veut faire des programmes alors qu'il ne sait pas comment utiliser les conditions...", bah c'est juste que j'ai pas vraiment été habitué à cela. Juste pourriez-vous corriger mon script alors ?
Merci d'avance, je cherche toujours de mon côté !
Étudiant en 2ème année de Licence Informatique.