Page 1 sur 1
[..] Envoi de fichier par TCP
Posté : dim. 24 mai 2009 20:10
par Yoyo86220
Bonsoir,
Je voudrai faire un script d'envoi de fichier sur un port TCP et un script de réception je n'arrive pas à le faire merci de me donner un coup de main...
Re: [..] Envoi de fichier par TCP
Posté : dim. 24 mai 2009 20:28
par Iste
Salutations,
repren les exemples serveur/client de la doc,
Mais au lieux d'envoyer du simple texte,
Code : Tout sélectionner
$File = FileOpen ("\fichier.txt",16)
$Data = FileRead ($File)
TCPSend($ConnectedSocket, $Data)
et au lieu d'afficher du texte dans un edit il faut
Code : Tout sélectionner
$var = TCPRecv($ConnectedSocket, 10000)
FileWrite("DL.txt",$var)
Si ca ne t'aide pas, je ferais un exemple complet
Edit :
Bon ben, je l'ai quand meme fait...
par contre je ne l'ai pas testé !
Testé en local, opérationel !
► Afficher le texteServer
Code : Tout sélectionner
#include <GUIConstantsEx.au3>
Opt('MustDeclareVars', 1)
;==============================================
;==============================================
;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
Local $nPORT = 33891
Local $MainSocket, $GOOEY, $edit, $ConnectedSocket, $szIP_Accepted
Local $msg, $recv, $File
; 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
;==============================================
$GOOEY = GUICreate("My Server (IP: " & $szIPADDRESS & ")", 300, 200)
$edit = GUICtrlCreateEdit("", 10, 10, 280, 180)
GUISetState()
; Initialize a variable to represent a connection
;==============================================
$ConnectedSocket = -1
;Wait for and Accept a connection
;==============================================
Do
$ConnectedSocket = TCPAccept($MainSocket)
Until $ConnectedSocket <> -1
; Get IP of client connecting
$szIP_Accepted = SocketToIP($ConnectedSocket)
; GUI Message Loop
;==============================================
$File = FileSaveDialog("",@DesktopCommonDir,"All (*.*)")
While 1
$msg = GUIGetMsg()
; GUI Closed
;--------------------
If $msg = $GUI_EVENT_CLOSE Then ExitLoop
; Try to receive (up to) 2048 bytes
;----------------------------------------------------------------
$recv = TCPRecv($ConnectedSocket, 2048)
; 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 GUICtrlSetData($edit, _
$szIP_Accepted & " > " & $recv & @CRLF & GUICtrlRead($edit))
FileWrite ($File,$recv)
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), "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
► Afficher le texteClient
Code : Tout sélectionner
#include <GUIConstantsEx.au3>
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 $szIPADDRESS = @IPAddress1
Local $nPORT = 33891
Local $File
; 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 = FileOpenDialog("",@DesktopCommonDir,"All (*.*)")
; 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.
$File = FileOpen ($szData,16)
$szData = FileRead ($File)
TCPSend($ConnectedSocket, $szData)
; If the send failed with @error then the socket has disconnected
;----------------------------------------------------------------
If @error Then ExitLoop
WEnd
EndIf
EndFunc ;==>Example
Re: [..] Envoi de fichier par TCP
Posté : lun. 25 mai 2009 07:20
par L4crymal
FAUX !!!
il ne faut jamais envoyer un fichier d'un coup.... imagine si c'est un film...
Tu doit d'abord découpé la chaine de caractère qui compose le fichier en plusieurs partie car le TCP peut accepter un nombre limite de bytes reçus.
Re: [..] Envoi de fichier par TCP
Posté : lun. 25 mai 2009 12:33
par Iste
On envoi rarement des films par TCP

et c'est juste un exemple de comment faire qui marche dans 90% du temps en plus
Donc apres libre a toi de completer l'exemple pour que ca soit plus pro :p (j'en prendrais d'ailleur aussitot note)
Pis sinon, j'ai essayer d'envoyer une video de 800mo prise avec mon appareil photo entre deux PC distant via le net, c'est lent mais ca fonctionne, donc je pense avoir bien répondu ^^
Edit : J'ai retiré toute ambiuitée de mon message

Et j'ai réellement fait le test avec une de mes propre video de mes petits rats !
Re: [..] Envoi de fichier par TCP
Posté : lun. 25 mai 2009 19:43
par sylvanie
Bonsoir à tous,
Juste une petite remarque sur la forme pour le bien du forum.
L'illustration de l'envoie d'un film résume bien la problématique des gros échanges, mais essayez d'éviter cet exemple, car il y a toujours l'image du téléchargement illégal qui plane au dessus de ceci, ce qui n'est pas très bon pour l'image du site.
Je sais bien que L4crymal devait surement parler des son film perso ; sans droit de licence; de ses vacances à St Malo où il a brillament remporté le concours local de gobage de petits suisses, mais à l'avenir on parlera plutôt d'envoie de fichiers volumineux de plusieurs Go,comme ça, ça lèvera toute ambiguïté.
Merci à tous.
Re: [..] Envoi de fichier par TCP
Posté : lun. 25 mai 2009 21:50
par jl56
Bonjour sylvanie
STP peut tu corriger l'orthographe
je suis née a 35 KM de ST MALO
Merci
A+ JL56
PS j'adhère bien sur à tes remarques
Re: [..] Envoi de fichier par TCP
Posté : lun. 25 mai 2009 21:58
par sylvanie
Voilà, et toutes mes excuses aux habitants plus ou moins proches de Saint Malo.
Prochaine fois je prendrais Limoges et son concours local de jet de balle de foin. ^^
Re: [..] Envoi de fichier par TCP
Posté : mar. 26 mai 2009 12:48
par Yoyo86220
merci de vos réponses! cette exemple marche parfaitement
je voudrai si possible avoir la technique la plus rapide de transfert et la plus fiable...
Re: [..] Envoi de fichier par TCP
Posté : mar. 26 mai 2009 13:51
par Iste
Benn, apres ca dépend de ce que tu veux envoyer. Je demande pas le contenu hein ^^ mais la taille et la fréquence.
Mais déja, tu peux changer la ligne
par
Ca accelere pas mal le truc
Re: [..] Envoi de fichier par TCP
Posté : mar. 26 mai 2009 22:54
par L4crymal
Oui mais attention pour ceux qui ont pas beaucoup de RAM ça va planter si tu met trop ...