Page 2 sur 2
Re: [..] Créer un chat en réseau local
Posté : jeu. 16 oct. 2008 00:13
par alex65
Le socket et l'interface de communication réseau ou local.
Il faut lancer le socket sur le premier poste en mode "listen" (adresse IP plus port de communication) avec TCPStartUp(), TCPListen() et TCPAccept() puis à partir d'un autre poste établir la connexion avec TCPStartUp() et TCPConnect().
Une fois la connexion établie, il faut utiliser les fonctions TCPSend() et TCPRecv() pour envoyer des données.
Les exemples de l'aide concernant les fonction TCPSend() et TCPRecv() montrent bien le principe. Le code de TCPRecv() correspond au serveur et le code de TCPSend() correspond au client
Re: [..] Créer un chat en réseau local
Posté : jeu. 16 oct. 2008 18:51
par timmalos
Les fonctions TCP necessitent l'utilisation d'un serveur: je mets ici 2 script qui ne sont pas de moi mais je ne connais plus le nom de leur auteur, peut etre qu'ils pourront t'aider :
► Afficher le texteCode du serveur a lancer en premier
Code : Tout sélectionner
#include <GUIConstantsEx.au3>
#include <all.au3>
#include <Date.au3>
Opt('MustDeclareVars', 1)
Opt("TrayMenuMode",1) ;0=append, 1=no default menu, 2=no automatic check, 4=menuitemID not return
Opt("TrayAutoPause",0)
;==============================================
;==============================================
;SERVER!! Start Me First !!!!!!!!!!!!!!!
;==============================================
;==============================================
Example()
Func Example()
; Set Some reusable info
; Set your Public IP address (@IPAddress1) here.
; Local $szServerPC = @ComputerName
; Local $szIPADDRESS = TCPNameToIP($szServerPC)
Local $szIPADDRESS = @IPAddress1
Msgbox(0,"",@IPAddress1)
Local $nPORT = 33891
Local $MainSocket, $GOOEY, $edit, $ConnectedSocket, $szIP_Accepted
Local $msg, $recv
; Start The TCP Services
;==============================================
TCPStartup()
; Create a Listening "SOCKET".
; Using your IP Address and Port 33891.
;==============================================
$MainSocket = TCPListen($szIPADDRESS, $nPORT)
; If the Socket creation fails, exit.
If $MainSocket = -1 Then Exit
; Create a GUI for messages
;==============================================
TrayTip("","My Server (IP: " & $szIPADDRESS & ")", 4)
$GOOEY = GUICreate("My Server (IP: " & $szIPADDRESS & ")", 300, 200,-1,-1,-1,$WS_EX_TOPMOST)
; Initialize a variable to represent a connection
;==============================================
$ConnectedSocket = -1
;Wait for and Accept a connection
;==============================================
Do
$ConnectedSocket = TCPAccept($MainSocket)
$msg = GUIGetMsg()
; GUI Closed
;--------------------
If $msg = $GUI_EVENT_CLOSE Then ExitLoop
Until $ConnectedSocket <> -1
; Get IP of client connecting
$szIP_Accepted = SocketToIP($ConnectedSocket)
; GUI Message Loop
;==============================================
While 1
$msg = GUIGetMsg()
; GUI Closed
;--------------------
If $msg = $GUI_EVENT_CLOSE Then ExitLoop
; Try to receive (up to) 2048 bytes
;----------------------------------------------------------------
$recv = TCPRecv($ConnectedSocket, 2048)
;MsgBox (0,"test", $recv)
; If the receive failed with @error then the socket has disconnected
;----------------------------------------------------------------
;If @error Then ExitLoop
; Update the edit control with what we have received
;----------------------------------------------------------------
;If $recv <> "" Then Traytip("", _Now() & " : " & $recv,5 )
If $recv <> "" Then Traytip("", $recv,5 )
WEnd
If $ConnectedSocket <> -1 Then TCPCloseSocket($ConnectedSocket)
TCPShutdown()
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), "ptr", 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
► Afficher le texteclient a lancer en 2eme
Code : Tout sélectionner
#include <GUIConstantsEx.au3>
$szIPADDRESS = InputBox("Question", "Envoyer à quel ip ?", "192.168.1.3")
Opt('MustDeclareVars', 1)
;==============================================
;==============================================
;CLIENT! Start Me after starting the SERVER!!!!!!!!!!!!!!!
;==============================================
;==============================================
Example()
Func Example()
; Set Some reusable info
;--------------------------
Local $ConnectedSocket, $szData
; Set $szIPADDRESS to wherever the SERVER is. We will change a PC name into an IP Address
; Local $szServerPC = @ComputerName
; Local $szIPADDRESS = TCPNameToIP($szServerPC)
Local $nPORT = 33891
; Start The TCP Services
;==============================================
TCPStartup()
; Initialize a variable to represent a connection
;==============================================
$ConnectedSocket = -1
;Attempt to connect to SERVER at its IP and PORT 33891
;=======================================================
$ConnectedSocket = TCPConnect($szIPADDRESS, $nPORT)
; If there is an error... show it
If @error Then
MsgBox(4112, "Error", "TCPConnect failed with WSA error: " & @error)
; If there is no error loop an inputbox for data
; to send to the SERVER.
Else
;Loop forever asking for data to send to the SERVER
While 1
; InputBox for data to transmit
$szData = InputBox("Data for Server", @LF & @LF & "Enter data to transmit to the SERVER:")
; If they cancel the InputBox or leave it blank we exit our forever loop
If @error Or $szData = "" Then ExitLoop
; We should have data in $szData... lets attempt to send it through our connected socket.
TCPSend($ConnectedSocket, $szData)
; If the send failed with @error then the socket has disconnected
;----------------------------------------------------------------
If @error Then ExitLoop
WEnd
EndIf
EndFunc ;==>Example
Re: [..] Créer un chat en réseau local
Posté : ven. 17 oct. 2008 00:34
par gotcho
S'il vous plait arrêtez de me parler de serveurs et de clients !!!
Cette architecture est impossible pour moi !
Pour créer un réseau de pair à pair (P2P), il faut que chaque PC soit à la fois client et serveur. Je suis sûr que c'est possible, je vais décortiquer un peu les codes TCP...
Re: [..] Créer un chat en réseau local
Posté : ven. 17 oct. 2008 01:08
par Tlem
gotcho a écrit :S'il vous plait arrêtez de me parler de serveurs et de clients !!!
Ha ok, mais pourtant vous en parlez aussi ...
gotcho a écrit :Pour créer un réseau de pair à pair (P2P), il faut que chaque PC soit à la fois client et serveur.
Donc pour résumer, avec un Client/Serveur sur un poste puis un Client/Serveur sur un autre poste ça devrait le faire !
Le tout c'est de bien choisir les ports de communication.

Re: [..] Créer un chat en réseau local
Posté : ven. 17 oct. 2008 01:36
par gotcho
Ca va vite devenir ingérable.
J'ai réussi à faire envoyer une demande de connexion TCP à une autre machine, et elle répond, mais si celle-ci n'est pas connectée, mon programme se gèle bonne vingtaine de secondes avant de renvoyer une erreur sur la connexion, empêchant tout bouton d'annulation de fonctionner...
Re: [..] Créer un chat en réseau local
Posté : ven. 17 oct. 2008 12:59
par alex65
En reprenant les 2 scripts de l'aide, en mode évènementiel et en rajoutant un ping, voilà ce que cela donne :
► Afficher le texte
Code : Tout sélectionner
#include <GUIConstants.au3>
#include <GUIConstantsEx.au3>
#include <EditConstants.au3>
Opt('MustDeclareVars', 1)
Opt("GUIOnEventMode", 1)
#Region ### START Koda GUI section ### Form=
Global $Form1 = GUICreate("Form1", 633, 447, 193, 125)
GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close")
Global $Edit1 = GUICtrlCreateEdit("", 16, 120, 601, 233, $ES_READONLY)
GUICtrlSetData(-1, "")
Global $Input1 = GUICtrlCreateInput("Taper le texte du message ici", 16, 360, 601, 21)
GUICtrlSetOnEvent(-1, "Input1Change")
Global $Button1 = GUICtrlCreateButton("Envoyer", 480, 392, 129, 41, 0)
GUICtrlSetOnEvent(-1, "Button1Click")
Global $Input2 = GUICtrlCreateInput("Adresse IP du PC à joindre", 24, 16, 289, 21)
GUICtrlSetOnEvent(-1, "Input2Change")
Global $Button2 = GUICtrlCreateButton("Connexion", 392, 16, 185, 25, 0)
GUICtrlSetOnEvent(-1, "Button2Click")
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
Local $szIPADDRESS = @IPAddress1
Local $nPORT = 33891
Local $MainSocket, $ConnectedSocket = -1, $szData
Local $recv
Local $DszIPADDRESS = @IPAddress1
TCPStartup()
$MainSocket = TCPListen($szIPADDRESS, $nPORT)
If $MainSocket = -1 Then
MsgBox(0, "Erreur 1", "Erreur de création du socket !")
Exit
EndIf
While 1
If $ConnectedSocket = -1 Then
$ConnectedSocket = TCPAccept($MainSocket)
Else
$recv = TCPRecv($ConnectedSocket, 2048)
If @error Then
MsgBox(0, "Erreur 2", "Erreur de données reçues !")
Form1Close()
EndIf
If $recv <> "" Then GUICtrlSetData($Edit1, " > " & $recv & @CRLF & GUICtrlRead($Edit1))
EndIf
Sleep(100)
WEnd
Func Button1Click()
EndFunc
Func Form1Close()
If $ConnectedSocket <> -1 Then TCPCloseSocket($ConnectedSocket)
TCPShutdown()
Exit
EndFunc
Func Input1Change()
$szData = @IPAddress1 &" > "& GUICtrlRead($Input1)
TCPSend($ConnectedSocket, $szData)
If @error Then
MsgBox(0, "Erreur 4", "Erreur d'envoie")
Else
GUICtrlSetData($Edit1, $szData & @CRLF & GUICtrlRead($Edit1))
GUICtrlSetData($Input1, "")
EndIf
EndFunc
Func Button2Click()
$DszIPADDRESS = GUICtrlRead($Input2)
If Ping($DszIPADDRESS, 250) <> 0 Then
$ConnectedSocket = TCPConnect($DszIPADDRESS, $nPORT)
If @error Then
MsgBox(0, "Erreur 3", "Erreur de connexion au serveur")
Else
guictrlsetstate($Input2,$GUI_DISABLE)
guictrlsetstate($Button2,$GUI_DISABLE)
EndIf
EndIf
EndFunc
Func Input2Change()
Button2Click()
EndFunc
Même s'il faut des contrôles supplémentaires, ça n'a pas l'air de bloquer.
Bien sûr, il ne faut pas lancer 2 fois le programme sur le même poste !
Re: [..] Créer un chat en réseau local
Posté : ven. 17 oct. 2008 18:15
par gotcho
Le programme marche du tonnerre ! Merci beaucoup, je vais l'adapter un peu, je vous tiens au courant.
Re: [..] Créer un chat en réseau local
Posté : dim. 01 nov. 2009 01:58
par matwachich
timmalos a écrit :Et NetSend ne suffit pas?

Si ca marche, on pourra se baser la dessus pour fair eun programme un peu plus... elaboré
Essaye avec NetSend * message , qui va envoyé message a tous les ordinateurs conncetés aux resaux, ou netsend ip message, qui va envoyé le message a un seul ordinateur
C'est une commande dos, il faut avoir activer un truc mais je sais plus vraiment quoi, en tout cas renseigne toi sur google.
C'est vrai, il faut qu'un truc soit activé: c'est le service de reception des messages de windoz.
Et c'est comme ca:
- Démarrer -> Exécuter -> tape: services.msc - ENTREE
- Chercher "Affichage des messages" et double cliquer
- Dans type de démarage, mettre "Automatique" -> Appliquer
- Puis, plus bas, s'active le boutton "Demarrer", cliquer dessu et -> OK
Voila!
Re: [..] Créer un chat en réseau local
Posté : dim. 01 nov. 2009 08:51
par L4crymal
Net Send ne fonctionne pas sur Vista et +