PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → [WD12] Socket de données
[WD12] Socket de données
Débuté par stephane, 05 oct. 2008 13:29 - 20 réponses
Posté le 05 octobre 2008 - 13:29
Bonjour,
Ma question reposse sur les sockets, j'arrive a créer une socket entre deux postes et envoyer des messages textes ex :"BONJOUR,..." mais est-il possible d'envoyer des fichiers.FIC par socket et comment?
merci par avance
Posté le 05 octobre 2008 - 14:13
Malheureusement on ne peut envoyer que des chaînes de caractère avec les Sockets Windev. Ce qui est vraiment dommage. Et on ne peut d'ailleurs pas ouvrir un fichier en binaire, lire le contenu de celui ci en binaire via les Sockets :(
Posté le 05 octobre 2008 - 17:18
Alors a quoi peut service les socket ormis les messages pour une application de mesagerie ?
Posté le 05 octobre 2008 - 21:00
Cerede a écrit :

> Malheureusement on ne peut envoyer que des chaînes de caractère avec les Sockets Windev. Ce qui est vraiment dommage. Et on ne peut d'ailleurs pas ouvrir un fichier en binaire, lire le contenu de celui ci en binaire via les Sockets :(

Faux, on peut sans aucun problème envoyer du binaire avec les sockets.
Il suffit pour cela d'utiliser le type de variable "buffer" au lieu du
type "chaine".

Exemple:

Si tu veux envoyer un entier sans signe de deux octets au travers d'une
socket, tu fais:

nSize est un entier sans signe sur 2 octets0
bfData est un buffer
bfData[[1 a 2]]=nSize

SocketEcrit(socket,bfData[[1 a 2]])
Posté le 05 octobre 2008 - 22:20
bonjour,

Bien sur que l'on peut envoyer des fichiers fic ou autres par sockets

Il suffit de faire un flit par bloc de 1024 octets (je dis ça au hasard) faut faire des tests et transmettre bloc par bloc avec un socket.
Posté le 06 octobre 2008 - 01:40
Bonjour Stéphane...

sans avoir testé:
- charger le fichier dans uen chaine (fchargetexte)
- envoyer la chaine
- de l'autre coté, sauver la chaine comme un fichier (fsauvetexte)
- S nécessaire envoyer d'abord une chiane d'info contenant le nom du fichier

Si envoyer le contenu binaire du fichier en tant que chaine pose
problème, le transformer en 'chaine pure' soit avec sérialise, soit avec
la fonction de cryptage, option resultat ascii, soit encore avec les
fonctions d'encodage de chaine xxxversyyyy

Cordialement

--
Fabrice Harari
Consultant WinDev, WebDev et WinDev Mobile International

Plus d'information sur http://fabriceharari.com/index_FR.html


stephane wrote:
Bonjour,
Ma question reposse sur les sockets, j'arrive a créer une socket entre deux postes et envoyer des messages textes ex :"BONJOUR,..." mais est-il possible d'envoyer des fichiers.FIC par socket et comment?
merci par avance

Posté le 06 octobre 2008 - 15:53
Eu j'ai tester ça ne fonctionne pas...
Quand on lit le fichier fic avec flit ça renvoit une fois PCS et c'est tout, après plus rien...
Posté le 06 octobre 2008 - 17:11
Cerede a écrit :

Eu j'ai tester ça ne fonctionne pas...
Quand on lit le fichier fic avec flit ça renvoit une fois PCS et c'est tout, après plus rien...


Je vais me répéter mais bon ;-)
Il faut utiliser le type BUFFER et non CHAINE pour transmettre du binaire!

Dans ton cas, il faut:

- Ouvrir le fichier,
- Le lire par blocs (exemple: 4096 octets) jusqu'à sa fin
- Affecter le résultat de chaque lecture dans une variable de type BUFFER
- Transmettre la variable BUFFER via ta socket.
- Fermer ton fichier une fois lu et transmis.

Utilise la syntaxe suivante:

SocketEcrit(sSocket,bfBuffer[[ a taille(bfBuffer)]])

ou:

sSocket est le nom de la socket
bfBuffer la variable de type BUFFER

That's all.
Posté le 06 octobre 2008 - 18:22
Oui ok donc en gros comme ceci:

idfile est un entier = fOuvre(fRepExe() + "\Test.FIC", foLecture)
SI idfile ALORS
BuffFile est un Buffer
TANTQUE PAS fPositionne(idfile, 0, fpCourant) <> fpFin
BuffFile = fLit(idfile, 1024)
SocketEcrit("Serveur", BuffFile[[ A Taille(BuffFile)]])
FIN
fFerme(idfile)
FIN

Mais comment signifier au client que la fin di fichier est atteint et qu'il doit arreter de recevoir?
Posté le 06 octobre 2008 - 20:33
Bonjour

Comme je le disais dans mon post précédent concernant le nom du fichier,
on COMMENCE par enovyer ue chaine de paramètre (nom du fichier, TAILLE
du fichier, QUOI QUE CE SOIT D'AUTRE de nécessaire), comme ca, l'autre
coté n'a qu'à ajouter les tailles jusqu'au total

Cordialement

--
Fabrice Harari
International WinDev, WebDev and WinDev mobile Consulting

More information on http://www.fabriceharari.com


PS: Ca serait peut être une bonne idée de lire en détail les réponses
qu'on t'envoie ?

Cerede wrote:
Oui ok donc en gros comme ceci:

idfile est un entier = fOuvre(fRepExe() + "\Test.FIC", foLecture)
SI idfile ALORS
BuffFile est un Buffer
TANTQUE PAS fPositionne(idfile, 0, fpCourant) <> fpFin
BuffFile = fLit(idfile, 1024)
SocketEcrit("Serveur", BuffFile[[ A Taille(BuffFile)]])
FIN
fFerme(idfile)
FIN

Mais comment signifier au client que la fin di fichier est atteint et qu'il doit arreter de recevoir?
Posté le 07 octobre 2008 - 02:27
Oui en envoyant la taille mais il n'y a pas moyen de se passer de cette chaîne de paramètres?
Si on s'arrête quand la taille de ce qu'on a reçu est égale à 0 ça peut suffire non?
Posté le 07 octobre 2008 - 09:03
Bien sur...

si tu peux être CERTAIN que l'émetteur ne va pas se planter avant la
fin... Peux tu ?

Cordialement

--
Fabrice Harari
Consultant WinDev, WebDev et WinDev Mobile International

Plus d'information sur http://fabriceharari.com/index_FR.html


Cerede wrote:
Oui en envoyant la taille mais il n'y a pas moyen de se passer de cette chaîne de paramètres?
Si on s'arrête quand la taille de ce qu'on a reçu est égale à 0 ça peut suffire non?
Posté le 07 octobre 2008 - 10:46
Oui d'accord mais à ce moment ne faut il pas aussi mettre en place un contrôle d'erreur?
Etre sur que celui qui reçoit, a bien reçu ce qu'on a envoyé?

Et comment faire?
Posté le 07 octobre 2008 - 11:56
il suffit de mettre en place un CRC

Avec la fonction une fonction comme le MD5 ou mieux (a toi de voir), celui ci va te donner une chaine qui est unique a ton fichier.

une fois reçu ton fichier, tu compare les md5.

ps : tu peux mettre des mots clés comme
DEBUT taille de ton fichier + RC
FIN nom du fichier + RC

pour délimiter ton fichier
Posté le 07 octobre 2008 - 12:52
Ok pour comparer par exemple le MD5 du fichier une fois reçu, mais si le fichier est énorme.
Pourrait ton verifier a chaque paquet reçu?
Posté le 07 octobre 2008 - 19:16
Bien sur... il suffit d'envoyer un CRC par paquet (je ne pense pas que
ce soit nécessaire, mais c'est certainement possible)

Cerede wrote:
Ok pour comparer par exemple le MD5 du fichier une fois reçu, mais si le fichier est énorme.
Pourrait ton verifier a chaque paquet reçu?
Posté le 07 octobre 2008 - 19:55
Oui mais bon comment être sur qu'un paquet n'est pas été perdu...
Parce que pour un fichier volumineux on va pas s'amuser à renvoyé tout le fichier :(
Posté le 08 octobre 2008 - 02:06
En meme temps que le crc du paquet, tu envoie le numéro du paquet...

Fabrice Harari wrote:
Bien sur... il suffit d'envoyer un CRC par paquet (je ne pense pas que
ce soit nécessaire, mais c'est certainement possible)

Cerede wrote:
Ok pour comparer par exemple le MD5 du fichier une fois reçu, mais si le fichier est énorme.
Pourrait ton verifier a chaque paquet reçu?
Posté le 08 octobre 2008 - 09:43
Ok donc il faut prévoir un demande dans l'autre sens, si le receveur voit qu'il n'as pas reçu un paquet il le redemande a l'envoyeur. Mais du coup il faut que le receveur attende une confirmation à chaque paquet??? Parce que la ça va augmenter considérablement le temps d'envoi :(

Sinon pour mettre en MD5 j'utilise HashFichier(HA_MD5_128, <nom fichier>)
Mais cette fonction est assez lente vous auriez autre chose?

Merci :)
Posté le 08 octobre 2008 - 12:05
Il existe des classes md5 déja faite sur wdforge il me semble ou autres.
Il faut chercher !
au point ou vous en êtes, je vous conseille de mettre un serveur ftp.
Posté le 08 octobre 2008 - 23:15
Bjr,

Dans son message précédent, Florian a écrit :
Il existe des classes md5 déja faite sur wdforge il me semble ou autres.
Il faut chercher !
au point ou vous en êtes, je vous conseille de mettre un serveur ftp.


Et un hcopiefichier ? si c'est pour envoyer des *.fic....

a plus

--
-------------------------------------------------------------
www.ctc-soft.com
Gestion biblo-documentaire (free-share)
Comptabilité shareware
Logiciels de Gestion de saisie terrain
Spécialisé Tournées de boulangers
-------------------------------------------------------------