Page 2 sur 3

Re: Remplacer ReceiveNetworkFile

Publié : mar. 15/déc./2009 19:14
par Kwai chang caine
Top secret c'est un grand mot.....mais c'est pour mon boulot :roll:

Re: Remplacer ReceiveNetworkFile

Publié : mar. 15/déc./2009 20:36
par Ar-S
Tu pourras peut-être faire un "dérivatif" ?

Re: Remplacer ReceiveNetworkFile

Publié : mar. 15/déc./2009 22:15
par Kwai chang caine
Oui , oui, oui.....pas de probleme :D
Heuuuu ! c'est quoi un "déservatif" heu !!! dérivatif :roll:

Justement, j'aurais bien aimé vous montrer, ce que KCC y fait ..................avec les codes des autres :mrgreen:

Surtout que pour ce coup la, en fait, j'aurais fait que reunir les codes des autres :oops:
Parce que ce programme grace à vous, il a drolement de la gueule
J'en ai fait quelques un que je trouve joli, mais celui la a chaque fois que je le démarre, je trouve que j'ai eu une bonne idée, et que les copains ont eu drolement du talent, une sacré equipe quoi :wink:

En fin de compte, ce qui est cool, c'est le graphisme.....alors si un derivatif, c'est le meme programme mais pas complet, style une demo qui montre tous les effets "extrordinaires" (Enfin...c'est pas du NETMAESTRO..mais bon c'est un code qui lui arrive a la chaussure, puisque y'a une partie qui est de lui :mrgreen:)

D'un autre coté, ça devrait pas vous epater tant que ça, puisque c'est vous qui m'apprenez a faire ce que je fais, et donc vous savez le faire.
Mais moi.....c'est comme quand on pete...parfois on s'epate tout seul :lol:
Mais si ça t'interesse dizilemele....je vous doit bien ça, puisque je vous doit tout 8)

Re: Remplacer ReceiveNetworkFile

Publié : mar. 15/déc./2009 22:37
par venom
Definition dérivatif

en gros que tu fasse un dériver ou carrément nous montrer ton projet qui d'après toi "déchire sa mère" 8) :lol:








@++

Re: Remplacer ReceiveNetworkFile

Publié : mar. 15/déc./2009 22:58
par Kwai chang caine
venom a écrit :Definition dérivatif
en gros que tu fasse un dériver ou carrément nous montrer ton projet qui d'après toi "déchire sa mère" 8) :lol:
Dechire sa mere, dechire sa mere ....j'ai pas dit ça 8O
Moi, je le trouve beau....et en plus grace aux spirales de TYPHOON et SOLDAT quand tu le regarde, et ben tu le regarde, tu le regarde, tu le regarde encore et mon entreprise a fermé et je le regardais encore :lol:

Voila, mais commencer pas a faire monter la mayonnaise .......sinon vous risquez d'etre déçu :(
Si j'arrive a le terminer, car ça fait une semaine que j'arrette pas de dire que je vais le finir, mais grace a CLS j'y crois à nouveau, c'est promis....je ferais une demo graphique rien que pour vous, car comme dirait la pub...vous le valez bien :wink:

C'est mon chef qui va etre content :lol:

Re: Remplacer ReceiveNetworkFile

Publié : mer. 16/déc./2009 6:51
par venom
je sais bien que tu n'a pas dit cela :wink:








@++

Re: Remplacer ReceiveNetworkFile

Publié : mer. 16/déc./2009 8:41
par Kwai chang caine
venom a écrit :je sais bien que tu n'a pas dit cela :wink:
:wink:

En tout cas...C'est drolement dur de se faire un nom dans l'informatique..... :roll:
Moi j'ai pas encore de prénom :lol:
Un geek est un homme qui croit que 1 kilomètre est égale a 1024 mètre
Ahhh bon !!!! 8O
Bah un kilometre c'est quand meme pas 512 ou 2048 metres, que je sache !!! :?

Re: Remplacer ReceiveNetworkFile

Publié : mer. 16/déc./2009 9:45
par Cls
Salut,

voilà le code mis à jour : j'y ai ajouté une barre de progression ainsi que la vérification de l'intégrité reçu (en gros en compare le MD5 du fichier local avec celui du fichier distant).

A noté que ce bout de code est valable pour un seul utilisateur simultané (ce qui ne fait pas beaucoup...). Il est tout à fait possible (et assez facile) de le rendre compatible multi-utilisateur (histoire de pouvoir transféré plusieurs fichiers simultanément.

De même il est possible de vérifier l'intégrité de chaque bloc de données envoyés ou de demander une confirmation avant l'envoi, bref le code reste ouvert ;)

Code : Tout sélectionner

; ________________________________________________________
;
; Fonctions d'envoi et de réception d'un fichier
;
; ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

; Auteur : Cls
; Version : Décembre 2009
; Compatibilité : PB 4.40


; Structure de l'entête
Structure NETFILE_HEADER
  type.l
  no_packet.l
  offset_file.q
  flags.l
  data_size.l
EndStructure


; Configuration
; ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
#Destination_Directory = "C:\"


#READ_BUFFER_SIZE = 51200                        ; Taille du buffer de lecture
#HEADER_SIZE = SizeOf(NETFILE_HEADER)            ; Taille de l'entête
#PACKET_SIZE = #HEADER_SIZE + #READ_BUFFER_SIZE  ; Taille totale d'un packet de données


; Type de packet de données
; ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
#PACKET_TYPE_FILE_NAME      = $10110001
#PACKET_TYPE_FILE_CONFIRM   = $10110011
#PACKET_TYPE_TRANSFERT_FILE = $10110111
#PACKET_TYPE_MD5            = $10111111


; Code d'erreurs
; ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
#NETFILE_ERROR_BAD_CONNEXION     = $00000010
#NETFILE_ERROR_FILE_NOT_FOUND    = $00000100
#NETFILE_ERROR_FILE_NOT_READABLE = $00001000
#NETFILE_ERROR_FILE_NOT_WRITABLE = $00010000

#INTERNAL_ERROR = $FFFF


; Création d'un packet de données
; ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Procedure PacketCreate()
  *packet = AllocateMemory(#PACKET_SIZE)
  If *packet = 0 
    ProcedureReturn #INTERNAL_ERROR
  EndIf
  
  ProcedureReturn *packet
EndProcedure


; Création de l'entête d'un packet de données
; ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Procedure PacketCreateHeader(*packet, type.l, numero.q = 0, place_fichier.q = 0, taille_donnees.l = 0, drapeaux.l = 0)
  
  *p_packet = *packet
  
  PokeL(*p_packet, type)           : *p_packet + SizeOf(Long)
  PokeL(*p_packet, numero)         : *p_packet + SizeOf(Long)
  PokeQ(*p_packet, place_fichier)  : *p_packet + SizeOf(Quad)
  PokeL(*p_packet, drapeaux)       : *p_packet + SizeOf(Long)    
  PokeL(*p_packet, taille_donnees) : *p_packet + SizeOf(Long)
  
  ProcedureReturn *packet
EndProcedure


; Ajout des données à un packet
; ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Procedure PacketAddData(*packet, *donnees.l, taille.l)
  
  *p_packet = *packet
  *p_packet + SizeOf(NETFILE_HEADER)
  
  CopyMemory(*donnees, *p_packet, taille)
  
  ProcedureReturn *packet
EndProcedure

; Ajout de données de type chaine 
; ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Procedure PacketAddString(*packet, String.s, taille.l)
  *p_packet = *packet
  *p_packet + SizeOf(NETFILE_HEADER)
  
  PokeL(*p_packet, taille)           : *p_packet + SizeOf(Long)
  PokeS(*p_packet, String, taille)   : *p_packet + taille
  
  ProcedureReturn *packet
EndProcedure


; Procédure de DEBUG d'un paquet
; ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Procedure PacketDebug(*packet, taille.l)
  
  *header.NETFILE_HEADER = *packet

  Debug "No Packet : " + Str(*header\no_packet)
  Debug "Offset : " + Str(*header\offset_file)
  Debug "Flags : " + Str(*header\flags)
  Debug "DATA size : " + Str(*header\data_size)
  
  *packet + SizeOf(NETFILE_HEADER)
  
  str.s
  For x = 0 To taille - SizeOf(NETFILE_HEADER)
    str + Chr(PeekC(*packet + x))
  Next
  
  Debug str
  
EndProcedure


; Message d'erreur
; ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Procedure Error(msg.s, type.l = 1)
  Select type
    Case 1
      MessageRequester("Erreur", msg, #MB_ICONINFORMATION)
    Default
      Debug msg
  EndSelect
EndProcedure

; Affichage sur l'IHM
; ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Procedure Message(msg.s)
  Global log
  msg = FormatDate("%dd/%mm %hh:%ii:%ss", Date()) + " - " + msg
  
  AddGadgetItem(log, -1, msg)
EndProcedure


; Procédure d'envoi d'un fichier
; ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
; @param Connexion l'identifiant de la connexion
; @param Fichier le fichier à envoyer
; @param Fichier_destination le nom du fichier qui sera cré en local
; @param Loopback une fonction permettant de connaitre l'état du transfert (optionel)
; @return 1 si le fichier est envoyé correctement
Procedure SendNetworkFileEx(Connexion.l, Fichier.s, Fichier_destination.s = "", *Loopback.l = #Null)
  
  ; Contrôles
  ; ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  
  ; Vérifie la connexion
  If Connexion = 0
    ProcedureReturn #NETFILE_ERROR_BAD_CONNEXION
  EndIf
  
  ; Vérifie le fichier
  total_filesize.q = FileSize(Fichier)
  If total_filesize < 0
    ProcedureReturn #NETFILE_ERROR_FILE_NOT_FOUND
  EndIf
  
  
  ; Création d'un buffer de lecture
  *read_buffer = AllocateMemory(#READ_BUFFER_SIZE)
  If *read_buffer = 0 
    ProcedureReturn #INTERNAL_ERROR
  EndIf
  
  ; Création d'un buffer pour l'envoi des données (packet)
  *packet = PacketCreate()
   
  
  ; Transfert
  ; ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  ; Handle vers le fichier
  hFile.l = ReadFile(#PB_Any, Fichier)
  If hFile = 0
    ProcedureReturn #NETFILE_ERROR_FILE_NOT_READABLE
  EndIf
  
  
  
  ; Lit le fichier par bloc
  p_locate_file.q = 0
  numero_packet.l = 0 
  data_send.q = 0
  While Eof(hFile) = 0
  
    ; Lit un bloc de READ_BUFFER
    read_length = ReadData(hFile, *read_buffer, #READ_BUFFER_SIZE)
    
    ;Debug Str(read_length) + " " + Str(p_locate_file)
    
    ; Création d'un paquet de données
    If read_length = #READ_BUFFER_SIZE
      ; Packet "normal"
      *packet = PacketCreateHeader(*packet, #PACKET_TYPE_TRANSFERT_FILE, numero_packet, p_locate_file, read_length)
    Else
      ; Dernier packet de données
      *packet = PacketCreateHeader(*packet, #PACKET_TYPE_TRANSFERT_FILE, numero_packet, p_locate_file, read_length, 1)
    EndIf
    
    ; Ajout des données à envoyer
    *packet = PacketAddData(*packet, *read_buffer, read_length)
    
    ; Envoi du packet sur le réseau
    SendNetworkData(Connexion, *packet, #PACKET_SIZE)
    
    ;PacketDebug(*packet, read_length + #HEADER_SIZE) 
    
    data_send + read_length
    
    ; Appel la loopback
    If *Loopback <> #Null
      CallFunctionFast(*Loopback)
    EndIf
    
    ; Déplace le pointeur de lecture
    p_locate_file + read_length
    FileSeek(hFile, p_locate_file)
    
    ; Packet suivant
    numero_packet + 1
    
    ; Delay
    Delay(1)
    
  Wend
  
  ; Libération des mémoires
  CloseFile(hFile)
  
  FreeMemory(*read_buffer)
  FreeMemory(*packet)


  ProcedureReturn #True
EndProcedure



; Procédure de reception d'un fichier
; ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
; @param Connexion l'identifiant de la connexion Client
; @param AutoriserNomPersonnalise A true, permet au client de spécifier le nom du fichier
; @param Loopback une fonction permettant de connaitre l'état du transfert (optionel)
; @return 1 si le fichier est recu correctement
Procedure ReceiveNetworkFileEx(Connexion, Fichier.s, *packet.l, length.l, *Loopback.l = #Null)

  ; Contrôles
  ; ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
    
  ; Vérifie la connexion
  If Connexion = 0
    ProcedureReturn #NETFILE_ERROR_BAD_CONNEXION
  EndIf
  
  ; Définition du nom du fichier 
  Fichier_destination.s = Fichier
  
  ; Création d'un buffer d'écriture réception
  *write_buffer = AllocateMemory(#PACKET_SIZE)
  If *write_buffer = 0 
    ProcedureReturn #INTERNAL_ERROR
  EndIf
  
  ; Création d'un buffer contenant le packet entier
  *packet_received = PacketCreate()

  
  ; Recompose le packet de données 
  ; ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  CopyMemory(*packet, *packet_received, length)
  
  
  ; Ecriture sur le disque
  ; ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  
  ; A ce moment *packet contient le packet de données entier
  ;PacketDebug(*packet_received, #PACKET_SIZE)
  
  ; On le réaassemble sur notre disque
  hWriteFile = OpenFile(#PB_Any, #Destination_Directory + Fichier_destination)
  If hWriteFile = 0
    ProcedureReturn #NETFILE_ERROR_FILE_NOT_WRITABLE
  EndIf
  
  ; Entête
  *header.NETFILE_HEADER = *packet_received
  
  ; Données
  *p_packet = *packet_received
  *p_packet + SizeOf(NETFILE_HEADER)

  
  ; Déplace le pointeur d'écriture et écrit les données
  ; Si le pointeur dépasse la fin du fichier, on rempli de vide
  If *header\offset_file > Lof(hWriteFile)
    FileSeek(hWriteFile, Lof(hWriteFile))
    
    taille_to_fill.l = *header\offset_file - Lof(hWriteFile)
    *filler = AllocateMemory(taille_to_fill)
    FillMemory(*filler, taille_to_fill)
    
    WriteData(hWriteFile, *filler, taille_to_fill)
  EndIf
  
  FileSeek(hWriteFile, *header\offset_file) 
  WriteData(hWriteFile, *p_packet, *header\data_size)
  
  ; Libération des mémoires
  CloseFile(hWriteFile)
  
  FreeMemory(*write_buffer)
  FreeMemory(*packet_received)
  
  
  ; Appel de la CallBack
  ; ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  If *Loopback <> #Null
    CallFunctionFast(*Loopback)
  EndIf
  
EndProcedure


; Sélection et envoi d'un fichier
; ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Procedure SelectAndSendFile(value.l)
  
  Global client 
  
  file.s = OpenFileRequester("", "", "", 1)
  
  If file
    
    ; Modification du nom du fichier
    ; ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
    FileName.s = GetFilePart(file)
    
    *packet = PacketCreate()
    *packet = PacketCreateHeader(*packet, #PACKET_TYPE_FILE_NAME, 0, FileSize(file), Len(FileName))
    *packet = PacketAddString(*packet, FileName, Len(FileName))
    SendNetworkData(client, *packet, #PACKET_SIZE)
    
     
    ; Envoi des données au serveur
    ; ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
    ret = SendNetworkFileEx(client, file)
    If ret <> 1
      
      Error(Str(ret))
      
    Else
    
      ; Confirmation
      ; ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
      *packet = PacketCreate()
      *packet = PacketCreateHeader(*packet, #PACKET_TYPE_FILE_CONFIRM)
      SendNetworkData(client, *packet, #PACKET_SIZE)    
      
      
      ; Vérification de l'intégrité du fichier
      ; ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
      md5.s = MD5FileFingerprint(file)
      *packet = PacketCreate()
      *packet = PacketCreateHeader(*packet, #PACKET_TYPE_MD5)
      *packet = PacketAddString(*packet, md5, Len(md5))
      SendNetworkData(client, *packet, #PACKET_SIZE)
      
    EndIf
  
  EndIf
  
EndProcedure


; Met à jour la barre de progression
; ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Procedure RefreshProgressBar(Transfert.q, Total.q)
  Global progress, progress_text
  
  pourcentage.f = Transfert / Total * 100
  SetGadgetText(progress_text, Str(pourcentage) + " %")
  SetGadgetState(progress, pourcentage)
  
EndProcedure



Procedure CheckMd5FileFingerPrint(md5.s, file.s)
  If MD5FileFingerprint(file) = md5
    ProcedureReturn #True
  Else
    ProcedureReturn #False
  EndIf
EndProcedure  
; Gère les évènements du serveur
; ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Procedure ManageNetworkEvent(clientId)
  
  Static Fichier_Destination.s ; Fichier de destination 
  Static Fichier_Taille.q      ; Taille totale du fichier
  Static Fichier_Transfere.q   ; Taille reçue


  *packet = PacketCreate()
  length = ReceiveNetworkData(clientId, *packet, #PACKET_SIZE)
  
  *header.NETFILE_HEADER = *packet
  
  Select *header\type
    Case #PACKET_TYPE_FILE_NAME 

      taille_nom_fichier.l = PeekL(*packet + SizeOf(NETFILE_HEADER))
      Fichier_Destination = PeekS(*packet + SizeOf(NETFILE_HEADER) + SizeOf(Long), taille_nom_fichier)
      
      Fichier_Taille = *header\offset_file ; On utilise ce champ pour envoyer la taille du fichier
      Fichier_Transfere = 0
      
      Message("Changement du nom du fichier : " + Fichier_Destination + " (" + Str(Fichier_Taille) + " octets)")

    
    Case #PACKET_TYPE_TRANSFERT_FILE
      Message("Données reçues : " + Str(*header\data_size) + " octets")
      ReceiveNetworkFileEx(clientId, Fichier_Destination, *packet, length)
      
      Fichier_Transfere + *header\data_size
      
      RefreshProgressBar(Fichier_Transfere, Fichier_Taille)
      
    
    Case #PACKET_TYPE_FILE_CONFIRM
      Message("Transfert du fichier terminé !")
    
    Case #PACKET_TYPE_MD5
      taille_md5.l = PeekL(*packet + SizeOf(NETFILE_HEADER))
      MD5.s = PeekS(*packet + SizeOf(NETFILE_HEADER) + SizeOf(Long), taille_md5)
      
      If CheckMd5FileFingerPrint(MD5, #Destination_Directory + Fichier_Destination)
        Message("L'empreinte MD5 du fichier est correcte. Le fichier a été transféré correctement.")
      Else
        Message("Le fichier est corrompu ! :(")
      EndIf 
    Default
      Debug "Packet inconnu"
      
  EndSelect  
  
EndProcedure


;- Début du programe de test

If InitNetwork() = 0 
  Error("Pas de réseau")
  End
EndIf

;file.s = OpenFileRequester("", "", "", 1)
;SendNetworkFileEx(1, file)

; Ouverture d'un écran
#height = 350 : #width = 600
Global window = OpenWindow(#PB_Any, 0, 0, #width, #height, "Test SendNetworkFile / ReceiveNetworkFile par Cls", #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget)
Global log = ListViewGadget(#PB_Any, 10, 10, #width - 20, #height - 75)
Global progress = ProgressBarGadget(#PB_Any, 10, #height - 60, #width - 20, 10, 0, 100, #PB_ProgressBar_Smooth)
Global progress_text = TextGadget(#PB_Any, #width - 40, #height - 40, 30, 20, "0 %")
Global send = ButtonGadget(#PB_Any, 10, #height - 40, 150, 30, "Envoyer un fichier...") 



; Création d'un serveur
#port = 5000
Global server = CreateNetworkServer(#PB_Any, #port)
If server : Message("Serveur créé sur le port " + Str(#port)) : EndIf


; Création d'un client
Global client = OpenNetworkConnection("127.0.0.1", #port)


; Boucle des évènements
Quit.l
Repeat
  ;- Evènement fenêtre
  wEvent = WaitWindowEvent(1)
  Select wEvent
    Case #PB_Event_CloseWindow
      End
    Case #PB_Event_Gadget
      Select EventGadget()
        Case send
          CreateThread(@SelectAndSendFile(), 1)

      EndSelect
  EndSelect
  
  ;- Evènement réseau Serveur
  sEvent = NetworkServerEvent()
  clientId = EventClient()
  Select sEvent
    Case #PB_NetworkEvent_Connect
      Message("Client connecté : " + IPString(GetClientIP(clientId)) + ":" + Str(GetClientPort(clientId)))
      
    Case #PB_NetworkEvent_Data
      ManageNetworkEvent(clientId)
      
    Case #PB_NetworkEvent_Disconnect
      Message("Client déconnecté : " + IPString(GetClientIP(clientId)) + ":" + Str(GetClientPort(clientId)))
      
  EndSelect
  
  ;- Evènement réseau Client
  tEvent = NetworkClientEvent(server)
  Select tEvent
    Case #PB_NetworkEvent_Data
      
  EndSelect
  
Until Quit = 1

Re: Remplacer ReceiveNetworkFile

Publié : mer. 16/déc./2009 11:36
par Cls
Je me réponds à moi - même ! :oops:

Je viens de faire quelques tests, il apparait que sur de gros fichiers, il y ait un pourcentage d'erreur assez élevé. Je vais donc mettre en place un système de vérification des paquets de données et de retransmission, en cas de problème. Ça va compliquer de manière significative mais bon...

Re: Remplacer ReceiveNetworkFile

Publié : mer. 16/déc./2009 12:27
par Kwai chang caine
Merci beaucoup CLS 8)

Effectivement, je comprend pourquoi mes 10 lignes d'envoi de fichier en une seule fois, ça marchais pas bien :(
Un truc de dingue ce FTP 8O

Je ne sais pas ce qu'il a mis dans sa barre chocolatée "ReceiveNetworkFile" le FRED, mais pour une fonction pas fiable, elle marchais pas trop mal :roll:

Apparement, c'est loin d'etre facile le transfert de fichier....
J'me suis mis dans de beaux draps....heureusement que t'as mis ta cape, parce que je crois que je serais obligé de rentrer dans mon bureau par la fenetre, pendant au moins 1 mois, vu comment j'ai fait baver les collegues avec mes demos.....
Ici Office regne en maitre, et moi, j'suis le petit gaulois qui dit Pb par ci, Pb par la....
Crosoft et son VB, c'est de la daube, regardez ce qu'on peut faire avec un "vrai" language :D

D'habitude, j'suis tranquille...PB s'en sort facilement, j'ai pas a protéger mes arrieres....
Et ben cette fois....j'l'ai dans l'os et le plus gros.....et j'vous dis pas lequel :?

CLS t'es un ange, je pense que ton travail, y va etre utile a pas mal d'entre nous....
Parce que y'a pleins de codes sur le US, mais ils sont pas vraiment complets, ficelé, et propre comme le tien :?

Celui que j'ai torturé pendant une journée, je l'ai trouvé un peu bordelique.....
http://www.purebasic.fr/english/viewtop ... 06#p157362

J'aime pas trop les conditions qui englobent tout un code...parce que j'ai pas arreté de scroller de haut en bas, et en plus je conseille pas d'oter un Endif......apres plus moyen de le remettre :?

Mais apparement tout le monde avait trouvé ça au top, meme NETMAESTRO, donc j'suis parti sur celui la... :(
Je crois sans trop me tromper, que tu pourrais etre celebre de l'autre coté :roll:

Y'avais aussi un code de IDLE...bien codé un peu a ta maniere, structure et tout et tout, car IDLE c'est un vrai programmeur, mais la .....ça boing et en plus il a juste mis les deux procedures "à sec".
Donc KCC, il a pas su l'utiliser....parce que KCC, il faut aussi lui ouvrir le petit pot de compote et lui tenir la cuillere...sinon il en met plein sa bavette :oops:

Ton code il est tellement propre, .........................apparement chez toi on peut manger par terre :mrgreen:

Re: Remplacer ReceiveNetworkFile

Publié : mer. 16/déc./2009 12:57
par Kwai chang caine
Je viens d'essayer ton super code.
Et les essais y sont pas concluant....j'ai meme cru que c'etait un des miens :lol:

J'ai essayé de transferer une image 'avec une jolie fille".....j'aime bien les jolies filles :mrgreen:

114 Ko et ben je sais pas pourquoi, y veut pas la transporter sur le C:\ :(
Alors j'ai essayé un gros fichier excell 8.4 Mo...la il l'a transporté sur le C...mais pas complet (Arret à 1% dans la progressbar) mais en fait j'ai reçu 6.6 Mo :(

KCC il est nul en math...mais meme lui y sait que 1% de 8.4 ça fait pas 6.6 :roll:

J't'en donne du tracas :oops:

Re: Remplacer ReceiveNetworkFile

Publié : mer. 16/déc./2009 13:34
par Cls
Non j'ai fait des tests et ça marche pas comme je l'espère. Je vais corriger le tir ;)

Re: Remplacer ReceiveNetworkFile

Publié : mer. 16/déc./2009 13:39
par Kwai chang caine
Merci...au pire...pendant ce temps la..j'peux ammener a boire...faire un peu a manger..mettre la table..faire la vaisselle !!!! pour me rendre utile :roll:

Re: Remplacer ReceiveNetworkFile

Publié : mer. 16/déc./2009 15:27
par Cls
Je trouve étonnant qu'il n'arrive pas à transporter 114k de données alors qu'au bureau il me transfère 40Mo sans trop de problème. Quelle config as - tu sur ton poste ?

En tout cas il y a bien un problème dans certains transferts, je travaille la dessus ('fin dès que j'ai du temps). ;)

Re: Remplacer ReceiveNetworkFile

Publié : mer. 16/déc./2009 16:18
par Kwai chang caine
On est au top...W2000 :D
Et pour PB je me suis mis à la v4.40 :?

Je sais, je sais j'avais juré d'attendre un max....
Mais comme ton code etait en v4.40, j'ai pas osé te demander comment on le transforme en 4.30 vu déjà le mal que tu te donne pour moi :oops:

Et pis....fallait bien y aller :(
Et comme j'ai lu sur le US, un pelo qui posait la meme question que moi, et que la réponse a été plus simple que les "Protozoides"...
Il a dit de mettre @ devant chaque string pour les callfunctions, ou bien pour etre au top utiliser mes "Prototrucs"...

Et ben devine ......comme le seul TOP que j'aurais connu dans ma vie c'est mon TOP CASE .......et ben.....j'ai mis des @ partout :mrgreen:
Mes codes maintenant y ressemblent a un carnet d'adresse de outlook :D

Bah oui pour la photo JPG, j'ai pas compris 8O
J'ai meme changé le nom, des fois que les espaces ne lui plaisent pas

Peut etre que cette fois, c'est trop petit ??? :roll:
PArce que pour etre sur de ce que je raconte, j'ai essayé tout plein de petits fichiers et ça fait pareil 8O

D'un coté, j'suis un peu rassuré....j'ai cru que ton programme il aimait pas les filles :?

Par contre, avec un fichier de 1.7 MO...et ben ça le créé en C:\ mais pas complet comme celui de 8.4 :roll: