Batch Index du Forum
S’enregistrerRechercherFAQMembresGroupesConnexion
Répondre au sujet Page 1 sur 1
programme client/serveur TCP
Auteur Message
Répondre en citant
Message programme client/serveur TCP 
Bonjour,

Sa faisait un moment que je souhaitai me pencher sur la question suivante: comment créer un client/serveur avec le protocol TCP en autoit ? ou comment faire communiquer 2 programmes à travers un réseaux IP.

Eh bien voici le résultat, un petit programme de test qui sait créer un serveur TCP avec gestion multi-clients et un petit module d'envoi de requêtes TCP.

Code:

#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 615, 438, 256, 277)
$Label1 = GUICtrlCreateLabel("envoi", 16, 8, 30, 17)
$Input1 = GUICtrlCreateInput("commande", 56, 8, 225, 21)
GUICtrlSetTip(-1,"message à envoyer")
$Label2 = GUICtrlCreateLabel("à", 296, 8, 10, 17)
$Input2 = GUICtrlCreateInput(@IPAddress1, 320, 8, 113, 21)
GUICtrlSetTip(-1,"adresse ip cible")
$Label3 = GUICtrlCreateLabel("port", 440, 8, 22, 17)
$Input3 = GUICtrlCreateInput("22000", 472, 8, 57, 21)
GUICtrlSetTip(-1,"port cible")
$Button1 = GUICtrlCreateButton("valider", 536, 8, 65, 25)
$Button3 = GUICtrlCreateButton("fin de connection", 8, 120, 120, 25)
$Edit1 = GUICtrlCreateEdit("", 8, 40, 601, 81)
$Edit2 = GUICtrlCreateEdit("", 8, 232, 593, 193)
$Label4 = GUICtrlCreateLabel("ecoute sur port", 8, 208, 75, 17)
$Input4 = GUICtrlCreateInput("22000", 96, 208, 65, 21)
GUICtrlSetTip(-1,"port d'écoute du serveur")
$Input5 = GUICtrlCreateInput(@IPAddress1, 180, 208, 100, 21)
GUICtrlSetTip(-1,"adresse ip du serveur")
$Input6 = GUICtrlCreateInput("2", 300, 208, 20, 21)
GUICtrlSetTip(-1,"nombre maximum de client simultanés")
$Button2 = GUICtrlCreateButton("activer/desactiver serveur", 355, 208, 200, 21)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

global $data_edit2,$data_edit1 ; déclaration des variables contenant les données des editbox
global $serveur_actif = 0,$terminate = 0 ; déclaration pour le fonctionnement du serveur
global $socket = -1 ; declaration du socket client

TCPStartup() ; création du service tcp pour tout le programme

_activer_desactiver_serveur(GUICtrlRead($Input5),GUICtrlRead($Input4),GUICtrlRead($Input6)) ; activation du serveur au démarrage du programme

While Not $terminate ; SHIFT + ESC pour quitter la boucle
   $nMsg = GUIGetMsg()
   Switch $nMsg
      Case $GUI_EVENT_CLOSE
         Exit
      case $Button1
         _envoi()
      case $Button3
         if TCPCloseSocket($socket) = 1 then $socket = -1
      case $Button2
         _activer_desactiver_serveur(GUICtrlRead($Input5),GUICtrlRead($Input4),GUICtrlRead($Input6))
   EndSwitch
   if $serveur_actif = 1 then _ecoute_serveur();fonctionne avec la fonction _msg pour le retour des informations
WEnd

exit



func _envoi()
   if $socket = -1 Then $socket = TCPConnect(GUICtrlRead($Input2),GUICtrlRead($Input3))
   If $socket = -1 Then
      _msg("Erreur de connexion : " & @error)
      return False
   EndIf
   $tmp = TCPSend($socket,GUICtrlRead($Input1))
   if not @error Then
      _msg("envoi " & $tmp & " bytes")
   Else
      _msg("erreur " & @error )
      Return
   EndIf
EndFunc

func _msg($msg,$edit = 1)
   if $edit = 2 Then
      $data_edit2 = @HOUR & ":" & @MIN & ":" & @SEC & " - " & $msg&@crlf& $data_edit2
      GUICtrlSetData($edit2,$data_edit2)
   EndIf
   if $edit = 1 Then
      $data_edit1 = @HOUR & ":" & @MIN & ":" & @SEC & " - " & $msg&@crlf& $data_edit1
      GUICtrlSetData($edit1,$data_edit1)
   EndIf
EndFunc

#region ;fonctions du serveur tcp - la fonction _msg("text",2) est utilisé pour retourner les informations


func _ecoute_serveur()
    ; Try to catch a connection
    $__iNewSocket = TCPAccept($__MainSocket)

    ; If new connection
    If $__iNewSocket <> -1 Then
        ; try to stor the connected socket in the sockets array
        For $i = 0 To $maxClients - 1
            If $__Sockets[$i] = -1 Then
                $__Sockets[$i] = $__iNewSocket
                _TCP_NewClientFunc($__iNewSocket) ; Triger the new client function
                ExitLoop ; New connection stored, exiting loop
            EndIf
        Next
    EndIf

    For $i = 0 To $maxClients - 1
        $__sRecv = TCPRecv($__Sockets[$i], 1024)

        ; Invalid socket (either client disconnect, or already invalid)
        If @error Then
            ; If it was previously connected (a valide socket)
            If $__Sockets[$i] <> -1 Then
                _TCP_ClientDisconnectFunc($__Sockets[$i]) ; Triger client disconnect function
            EndIf
            $__Sockets[$i] = -1 ; Reset the array's element to -1
            ContinueLoop
        EndIf

        ; If data received
        If $__sRecv Then
            _TCP_ReceiveFunc($__Sockets[$i], $__sRecv)
        EndIf
    Next
EndFunc

func _activer_desactiver_serveur($ip,$port,$max_clients)
   if $serveur_actif = 0 Then
      if _init_serveur_tcp($ip,$port,$max_clients) = False Then return false
      $serveur_actif = 1
   Else
      $serveur_actif = 0
      TCPCloseSocket($__MainSocket)
      For $i = 0 To $maxClients - 1 ; Init the array (-1 => Invalid socket)
         if $__Sockets[$i] <> -1 then TCPCloseSocket($__Sockets[$i])
      Next
      _msg("+> end server: " & $__IP & ":" & $__PORT ,2)
   EndIf
EndFunc

; ---
; Trigered when new client connects
Func _TCP_NewClientFunc($hSocket)
    _msg(">>> New client: " & _SocketToIP($hSocket) ,2)
EndFunc

; Trigered when some data received
Func _TCP_ReceiveFunc($hSocket, $sData)
    _msg($sData ,2)
   if StringInStr($sData,"GET / HTTP/") then
      $tmp = TCPSend($hSocket,"Serveur de test autoit")
      if not @error Then
         _msg("envoi " & $tmp & " bytes")
      Else
         _msg("erreur " & @error )
         Return
      EndIf
      TCPCloseSocket($hSocket)
   EndIf
EndFunc

; Trigered when client disconnects
Func _TCP_ClientDisconnectFunc($hSocket)
    _msg(">>> Client disconnected: " & _SocketToIP($hSocket) ,2)
EndFunc

; ---
TCPShutdown()

; ---
; Used to send data to all connected (valid) sockets
; NB: $iExeptionSocket used for example to not re-send data for the sender
;       in a chat program for example
Func _TCP_Broadcast($sData, $iExeptionSocket = -1)
    For $i = 0 To $maxClients - 1
        If $__Sockets[$i] <> -1 And $__Sockets[$i] <> $iExeptionSocket Then
            TCPSend($__Sockets[$i], $sData)
        EndIf
    Next
EndFunc

Func _terminate()
   If MsgBox(36, "Confirmation", "Quit?") = 7 Then Return
    $terminate = 1
EndFunc

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

func _init_serveur_tcp($__IP_ = "127.0.0.1",$__PORT_ = 8080,$maxClients_ = 10)
   Global $maxClients = $maxClients_
   Global $__Sockets[$maxClients] ; Array of connected sockets
   Global $__IP=$__IP_, $__PORT=$__PORT_
   Global $__MainSocket, $__iNewSocket, $__sRecv

   For $i = 0 To $maxClients - 1 ; Init the array (-1 => Invalid socket)
      $__Sockets[$i] = -1
   Next

   $__MainSocket = TCPListen($__IP, $__PORT) ; Creating server
   If @error Then
      _msg("Unable to create listening socket (" & @error & " - " & @extended & ")",2)
      return false
   EndIf
   _msg("+> Server created: " & $__IP & ":" & $__PORT ,2)

   HotKeySet("+{esc}", "_terminate")
   $terminate = 0

   return True
EndFunc
#endregion







______________________________________________________
Mes principales réalisations: Cp (batch) et IPSvc (autoit)
Message Publicité 
PublicitéSupprimer les publicités ?


Répondre en citant
Message programme client/serveur TCP 
Jolie , je ne suis pas un expert en autoit mais je voit du beaux travail Okay

Moi même je suis sur un projet Serveur/client mais batch et je pense qu'avec Netcat on pourrat faire pareil que ton script en autoit Idea




______________________________________________________
Expert Réseau & Anonymat !
" Les shell codes ??..c'est juste des boite a outils ! "


Visiter le site web du posteur
Répondre en citant
Message programme client/serveur TCP 
Intéressant, merci pour cette démo.




______________________________________________________
Message programme client/serveur TCP 


Montrer les messages depuis:
Répondre au sujet Page 1 sur 1
  



Index | créer un forum | Forum gratuit d’entraide | Annuaire des forums gratuits | Signaler une violation | Conditions générales d'utilisation
Copyright 2008 - 2016 // Batch