[..] Problème Chat TCP

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Unkn0wn
Niveau 1
Niveau 1
Messages : 3
Enregistré le : jeu. 03 avr. 2014 22:27
Status : Hors ligne

[..] Problème Chat TCP

#1

Message par Unkn0wn »

Bonjour, cher membres de autoitscript.fr ,
j'ai lu le cours de blacksoul305 sur TCP et IP, j'ai bien compris comment ça marche.
j'ai réussi à faire mon chat, mais ça ne marche que sur mon pc, quand j'essaye de lancer le serveur sur mon pc, et le client sur un autre, ça ne marche pas.
Voilà le code du server :
► Afficher le texte
voilà le code du client :
► Afficher le texte
J'ai essayé de changer le $port et de mettre un port que j'ai ouvert sur ma box, et de changer @IPAddress1, et mettre _GetIP() , mais ça m'avais donné des erreurs.
Je poste ici en espérant que j'aurai de l'aide, Merci d'avance :)
Modifié en dernier par jguinch le lun. 07 avr. 2014 20:58, modifié 1 fois.
Raison : Ajout de la balise Spoiler
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2511
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] Problème Chat TCP

#2

Message par jguinch »

Dans le code client, tu as $IP = @IPAddress1, ce qui signifie que ton client va se connecter sur un serveur dont l'adresse IP est... celle du client.
La fonction _GetIp() renvoie l'adresse IP publique d'une machine : ça ne fonctionnera donc pas non plus.
Il faut que tu indiques dans $IP l'adresse IP locale (ou le nom de machine) du poste sur lequel le script serveur tourne.
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Unkn0wn
Niveau 1
Niveau 1
Messages : 3
Enregistré le : jeu. 03 avr. 2014 22:27
Status : Hors ligne

Re: [..] Problème Chat TCP

#3

Message par Unkn0wn »

Merci pour ta réponse, je vais essayer :)

EDIT : ça marche super Merci infiniment, mais j'aimerai savoir, si ça existe une methode avec la quel je pourrais utiliser "no-ip" ^^ ?
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2511
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] Problème Chat TCP

#4

Message par jguinch »

Pour ce qui est du dialogue à travers internet, c'est faisable, mais demande soit une configuration du/des routeur(s)/box (port forwarding), soit un serveur relai.
Le plus simple sera la méthode du port forwarding, mais cela nécessitera un minimum de recherches de ta part. :(

Un sujet récent en lien avec le tien : http://autoitscript.fr/forum/viewtopic.php?f=3&t=12382

Merci de passer le sujet en [R] si le problème est résolu.
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Unkn0wn
Niveau 1
Niveau 1
Messages : 3
Enregistré le : jeu. 03 avr. 2014 22:27
Status : Hors ligne

Re: [..] Problème Chat TCP

#5

Message par Unkn0wn »

Bonjour, j'aimerai justement savoir une autre chose, pourquoi quand je lance mon server, et que je met mon ip public ça me met ça : "Impossible de créer un socket d'écoute. Code d'erreur : 10049"
il n'existe pas une solution pour cette erreur ?

PS : j'ai déjà ouvert un port sur ma box ...
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2511
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] Problème Chat TCP

#6

Message par jguinch »

L'adresse IP d'écoute doit être l'adresse du poste, pas l'adresse publique.
C'est la redirection de port qui fait le reste...
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 2086
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

Re: [..] Problème Chat TCP

#7

Message par TommyDDR »

Vous ne pouvez écouter que sur VOS interfaces réseau.
Donc, en général, si vous avez une box (pour la suite j'admet que les 2 PCs ont une box), une IP en 192.168.xxx.xxx

Code : Tout sélectionner

PC Client ----> |  Box Client   ---->  Box Server  | ---> PC Server
IP Client       |IP BOX Client        IP BOX Server|      IP Server
192.168.0.3     | 78.184.42.68        84.46.184.210|     192.168.0.7
| = Changement de réseau
Deux ordinateurs ne communiquent JAMAIS directement l'un avec l'autre.
- Le PC client ne voit que la Box Client
- La Box Client voit le PC Client et la Box Server (la box possède 2 interfaces réseau, une pour le réseau local (pc client), une pour internet)
- La Box Server voit la Box Client et le PC Server
- Le PC Server ne voit que la Box Server

Le serveur ne pouvant écouter que sur une de ses interfaces réseau, il écoute alors sur 192.168.0.7 (@IPAdress1)
Le client doit donc indiquer à sa box une IP pour que celle-ci peut voir pour s'y connecter : La box server.
La box va donc se connecter à la box Server, celle-ci reçoit une demande de connexion mais ne sait pas quoi en faire (ce qui est légitime par exemple si plusieurs PC sont connectés au réseau local de la Box), c'est pour cela qu'il faut configurer la box serveur pour dire : toutes les demandes du port XXXX doivent être redirigées vers l'IP 192.168.0.7.

C'est comme ça qu'est fait le lien entre le client et le serveur.

En espérant avoir été clair :roll: .
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
darkelle24
Niveau 1
Niveau 1
Messages : 2
Enregistré le : dim. 21 mai 2017 10:42
Localisation : Mérignac , Bordeaux
Status : Hors ligne

Re: [..] Problème Chat TCP

#8

Message par darkelle24 »

Bon j ai un peu le meme probleme sauf qu il me retourne en error 0 donc je ne comprend pas je me demandé alors si c est pas les pare feu qui bloque je vous post ci dessous mes code (J'ai moi aussi suivi les cour de blacksoul305 sur TCP) . En faite ca marche bien quand je suis en local mais des que je passe le client a quelqu un ca bug et lui affiche message d'erreur 0 donc si vous pouviez m aidez mrc d 'avance .
Client:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiIPAddress.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Array.au3>
#include <Misc.Au3>
#Region ### START Koda GUI section ### Form=e:\lolll\install\scite\koda\forms\client.kxf
$Form1_1 = GUICreate("Form1", 415, 332, 192, 231)
$IPAddress1 = _GUICtrlIpAddress_Create($Form1_1, 8, 48, 241, 25)
_GUICtrlIpAddress_Set($IPAddress1, "0.0.0.0")
$Input1 = GUICtrlCreateInput("", 288, 48, 113, 21)
$Label1 = GUICtrlCreateLabel("IP :", 24, 16, 20, 17)
$Label2 = GUICtrlCreateLabel("Port :", 296, 16, 29, 17)
$Input2 = GUICtrlCreateInput("", 16, 152, 377, 21)
$Label3 = GUICtrlCreateLabel("Username :", 40, 120, 58, 17)
$Cancel = GUICtrlCreateButton("Cancel", 264, 264, 121, 41)
$Connect = GUICtrlCreateButton("Connect", 22, 261, 121, 41)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

load()
Func load()
   While 1
      $nMsg = GUIGetMsg()
      Switch $nMsg
         Case $GUI_EVENT_CLOSE
            Exit
         Case $Connect
            $test = TCPStartup()
            If GUICtrlRead($Input2) = "" Then
               MsgBox(64, "probleme", "Veuillez taper un pseudo")
               load()
            EndIf
            GUICtrlSetState($Connect, $GUI_DISABLE)
            $IPSERVEUR = _GUICtrlIpAddress_Get($IPAddress1)
            Global $socket = TCPConnect($IPSERVEUR, GUICtrlRead($Input1))
;~             MsgBox(64,"$socket",$socket)
            If $socket = -1 Or $socket = 0 Then ; si on ne peut pas se connecter
               For $i = 0 To 20
                  Global $socket = TCPConnect($IPSERVEUR, GUICtrlRead($Input1))
                  Sleep(100)
               Next
            EndIf
            If $socket = -1 Or $socket = 0 Then ; si on ne peut pas se connecter
               MsgBox(16, "Client - erreur", "Impossible de se connecter. Code d'erreur : " & @error)
               TCPShutdown() ; le programme n'utilise plus le protocole TCP/IP
               Exit ; on quitte le programme
            Else
               TCPSend($socket, @IPAddress1 & "|" & GUICtrlRead($Input2))

               Start()
            EndIf


      EndSwitch
   WEnd
EndFunc   ;==>load


Func Start()
   Global $lent = 0
   While 1
      Global $Recv = TCPRecv($socket, 10000)
      ConsoleWrite($Recv & @CRLF)
      If $Recv = "Error : NoPlace" Then
         MsgBox(16, "Client - erreur", "Impossible de se connecter. Code d'erreur :  NoPlace")
         TCPCloseSocket($socket)
         TCPShutdown()
         GUICtrlSetState($Connect, $GUI_ENABLE)
         load()
      ElseIf $Recv = "Error : Username" Then
         MsgBox(16, "Client - erreur", "Impossible de se connecter. Code d'erreur :  Username")
         TCPCloseSocket($socket)
         TCPShutdown()
         GUICtrlSetState($Connect, $GUI_ENABLE)

         load()
      Else
         Global $Recvlol = StringSplit($Recv, "|")

         For $i = 2 To $Recvlol[0]
            If $Recvlol[$i] = "OK" Then
               Connected()
            EndIf
         Next
      EndIf



   WEnd


EndFunc   ;==>Start

Func Connected()

   MsgBox(64, "Exit", "Pour quitter taper /exit")
   $GUI = GUICreate('TCP Chat Room', 375, 275)
   $History = GUICtrlCreateEdit('', 0, 1, 375, 203, 2103360 + $ES_MULTILINE)
   GUICtrlSetFont($History, 10, -1, -1, 'Lucida Sans Unicode')
   GUICtrlSetBkColor($History, 0x83B4FC)
   GUICtrlSetColor($History, 0xFFFFFF)
   $Send = GUICtrlCreateInput('', 0, 205, 375, 70, 2101248)
   GUICtrlSetFont($Send, 10, -1, -1, 'Lucida Sans Unicode')
   GUICtrlSetColor($Send, 0x83B4FC)
   GUISetState(@SW_SHOW, $GUI)
   If  $Recvlol[0]>2 Then
      For $i=3 To $Recvlol[0]
         $Recvlol[$i]=StringReplace($Recvlol[$i],"|","")
         GUICtrlSetData($History, $Recvlol[$i] & @CRLF, 1)
         Next
   EndIf
   While 1
      $Recv = TCPRecv($socket, 10000000)
      $nMsg = GUIGetMsg()
      If $nMsg = $GUI_EVENT_CLOSE Then
         TCPSend($socket, "/exit")
         TCPCloseSocket($socket)
         Exit
      EndIf
      If $Recv <> '' Then
         Global $Recvlol = StringSplit($Recv, "|")
         For $i = 2 To $Recvlol[0]
            $Recvlol[$i]=StringReplace($Recvlol[$i],"|","")
            GUICtrlSetData($History, $Recvlol[$i] & @CRLF, 1)
         Next

      EndIf
      If _IsPressed('0D') And GUICtrlRead($Send) <> '' Then
         If GUICtrlRead($Send) = "/exit" Then
            TCPSend($socket, "/exit")
            TCPCloseSocket($socket)
            Exit
         Else
            $lil = TCPSend($socket, GUICtrlRead($Send))
            GUICtrlSetData($Send, "")
         EndIf
      EndIf

   WEnd


EndFunc   ;==>Connected

Serveur :
#include <GUIConstantsEx.au3>
#include <GuiIPAddress.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Array.au3>
#include <MsgBoxConstants.au3>
Global $principale[50][3]
Global $connected = 0
#Region ### START Koda GUI section ### Form=E:\LOLLL\install\SciTe\Koda\Forms\Serveur.kxf
$Form1 = GUICreate("Form1", 415, 332, 192, 231)
$IPAddress1 = _GUICtrlIpAddress_Create($Form1, 8, 48, 241, 25)
_GUICtrlIpAddress_Set($IPAddress1, @IPAddress1)
$Input1 = GUICtrlCreateInput("", 288, 48, 113, 21)
$Label1 = GUICtrlCreateLabel("IP :", 24, 16, 20, 17)
$Label2 = GUICtrlCreateLabel("Port :", 296, 16, 29, 17)
$Input2 = GUICtrlCreateInput("", 16, 152, 377, 21)
$Label3 = GUICtrlCreateLabel("Password :", 40, 120, 56, 17)
$Cancel = GUICtrlCreateButton("Cancel", 264, 264, 121, 41)
$Created = GUICtrlCreateButton("Created", 22, 261, 121, 41)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
   $nMsg = GUIGetMsg()
   Switch $nMsg
      Case $GUI_EVENT_CLOSE
         Exit
      Case $Cancel
         Exit
      Case $Created
         TCPStartup()
         $IPSERVEUR = _GUICtrlIpAddress_Get($IPAddress1)
         ConsoleWrite(GUICtrlRead($Input1)&@CRLF)
         Global $mainSocket = TCPListen($IPSERVEUR, GUICtrlRead($Input1), 50)
         If $mainSocket = -1 Or $mainSocket = 0 Then
            MsgBox(16, "Serveur - erreur", "Impossible de créer un socket d'écoute. Code d'erreur : " & @error)
         Else
            $recv = ""
            Start($mainSocket)
         EndIf


   EndSwitch
WEnd


Func Start($mainSocket)
   MsgBox(64, "Bravo", "Le serveur est connecté")
   GUICtrlSetState($Created, $GUI_DISABLE)
   While 1
      $nMsg = GUIGetMsg()
      Switch $nMsg
         Case $GUI_EVENT_CLOSE
            If $connected <> 0 Then
               For $i = 0 To $connected
                  TCPSend($principale[$i][2], "/Shutdown")
               Next
            EndIf
            TCPShutdown()
            Exit
         Case $Cancel
            If $connected <> 0 Then
               For $i = 0 To $connected
                  TCPSend($principale[$i][2], "/Shutdown")
               Next
            EndIf
            TCPShutdown()
            Exit
      EndSwitch
      Checklesconnexion($mainSocket)

      Receoislesmessage()

   WEnd
EndFunc   ;==>Start


Func Checklesconnexion($mainSocket)
   $ok = 0
   Global $socket = -1
   $socket = TCPAccept($mainSocket)
   If $connected = 50 Then
      TCPSend($socket, "Error : NoPlace")
ElseIf $socket <> -1 And $socket <> 0 Then
      ConsoleWrite("quelqu un "&@CRLF)
      If $socket <> -1 Then

         $info = TCPRecv($socket, 999)
         Local $tempArray[4]
         $tempArray = StringSplit($info, "|")
         $ok = 0

         $ip = $tempArray[1]
         $username = $tempArray[2]
         If $connected <> 0 Then
            For $i = 0 To $connected
               If $username = $principale[$i][0] Then

                  TCPSend($socket, "Error : Username")
                  $ok = -1
               EndIf
            Next
         EndIf
         If $ok = 0 Then
            Global $i = 0
            $test=TCPSend($socket, "|OK")
            ConsoleWrite($test&@CRLF)
            $connected = $connected + 1
            $principale[$connected - 1][0] = $username
            $principale[$connected - 1][1] = $ip
            $principale[$connected - 1][2] = $socket

            Systeme("New")
         EndIf
      EndIf
   EndIf
EndFunc   ;==>Checklesconnexion


Func Systeme($Commande)
   If $Commande = "New" Then
      If $connected>1 Then
      For $i = 0 To $connected-1
         $send = "|Systeme : " & $principale[$connected-1][0] & " s'est connecté"

ConsoleWrite($i&@CRLF)
         TCPSend($principale[$i][2], $send)
      Next
   ElseIf $connected = 1 Then
      $send = "|Systeme : " & $principale[$connected-1][0] & " s'est connecté"
         TCPSend($principale[0][2], $send)
         EndIf
   EndIf

EndFunc   ;==>Systeme


Func Receoislesmessage()
   If $connected <> 0 Then
      For $A = 0 To $connected
         $Recv = TCPRecv($principale[$A][2], 1000000)
         If StringInStr($Recv, "/") <> 1 And $Recv <> "" Then
            $send = "|"&$principale[$A][0] & " : " & $Recv
            For $i = 0 To $connected
               TCPSend($principale[$i][2], $send)

            Next
      ElseIf $Recv="/exit" Then
            $nom=$principale[$A][0]
            For $i=$A+1 to $connected
               $principale[$i-1][0]=$principale[$i][0]
               $principale[$i][0]=""
               $principale[$i-1][1]=$principale[$i][1]
               $principale[$i][1]=""
               $principale[$i-1][2]=$principale[$i][2]
               $principale[$i][2]=""
            Next
            $connected=$connected-1
            For $i = 0 To $connected
               TCPSend($principale[$i][2],"|Systeme : " & $nom & " s'est déconnecté")

            Next
         EndIf
      Next
   EndIf
EndFunc   ;==>Receoislesmessage
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [..] Problème Chat TCP

#9

Message par orax »

Code : Tout sélectionner

If $socket = -1 Or $socket = 0 Then ; si on ne peut pas se connecter
	For $i = 0 To 20
		Global $socket = TCPConnect($IPSERVEUR, GUICtrlRead($Input1))
		Sleep(100) ; <==
	Next
EndIf
If $socket = -1 Or $socket = 0 Then ; si on ne peut pas se connecter
	MsgBox(16, "Client - erreur", "Impossible de se connecter. Code d'erreur : " & @error)
La macro @error contient le code d'erreur de la fonction précédente. Donc dans ce cas, @error contient le code d'erreur de la fonction Sleep.
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
darkelle24
Niveau 1
Niveau 1
Messages : 2
Enregistré le : dim. 21 mai 2017 10:42
Localisation : Mérignac , Bordeaux
Status : Hors ligne

Re: [..] Problème Chat TCP

#10

Message par darkelle24 »

Ah merci au moins ca me donne un vrai code d'erreur : 10061 mais je comprend toujours pas d ou vient le probleme :(
De l aide serait encore grandement aprecier mrc
Répondre