[C++] Trasferer un fichier ( exe ou autre )
Forum Programmation : [C++] Trasferer un fichier ( exe ou autre )
Bonjour, voila le probléme : j'ai un client et un serveur. Le serveur tente de telecharger un fichier à partir du client. La fonction upload du client se met en route :
Code :
|
Le probléme est que lorsque je lis les octets :
Code :
|
Paquet1, qui doit contenir la valeur à envoyer n'a pas de caractére x00 donc je me retrouve avec une suite de caractéres mais sans x00 là où il faut ! Pour transferer un fichier txt je m'en fiche sa marche, mais pour un exe ca n'a plus rien avoir ....
Je le faisais en VB à une époque et j'utilisais un tableau de Bytes, mais la fonction send() n'acceptera jamais d'envoyer Byte(), si ca existe en C/C++, donc je galére !
J'ai essayé de placer un caractére special pour reconnaitre x00 mais dans le cas d'un exe on peut tomber sur n'importe quel suite d'octet donc c'est mort.
Si il y a moyen d'utiliser une autre fonctionqui enverrais un paquet sous forme binaire que je pourrais tout simplement écrire coté client ca m'arrangerait !
Help ?
Message édité par Hrusdik le 03-08-2008 à 21:06:00
Il te faut faire un protocole application par exemple:
octets 1 à 4: taille (xxxxxxxx) du bloc restant en little endian
octets 5 à xxxxxxxx: les données
Après le mieux est aussi d'ajouter un tag devant au début du genre:
00: demande de fichier
01-7F: Réservé pour une utilisation future
80: réponse avec fichier
81-FF: Réservé pour une utilisation future
Et n'utilise pas de fonction str..., mais la fonction memcpy.
Message édité par CRicky le 04-08-2008 à 15:57:22
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
Hmmm... c'est à dire ?
Tu veux que j'envoye les paquets en les encapsulant dans mon propre protocol ?
ex: 00|taille|data ?
Mais ca va pas ralentir le transfert ?
Je devrais deplacer de gros fichier comme des bases de données accés etc ... donc il faut que ca soit le plus rapide possible, c'est à dire que pendant le transfert je dois pas traiter la chaine recue, je la mets directement dans le fichier de sortie, et c'est tout.
Si non la taille est toujours la meme : SizeTransfertPaquet. Donc pas besoin de le preciser non ?
Ce qui est bizzard c'est que ce code marche avec un server en C++, je pense donc que c'est peut etre ma fonction VB.Net qui ecrit dans le fichier qui est mauvaise ? J'utilise Microsoft.VisualBasic.Put(1,RecievedData,position). Il faut peut etre que j'utilise Microsoft.VisualBasic.FileIO.FileSystem.WriteAllBytes() ?
Mais dans ce cas la je sais pas comment convertire ma chaine de String en Tableau de Bytes(). Par ce que, par exemple la premiere chaine d'un exe est "MZ", ce qui est bizzard c'est que pourtant il y a d'autres octets différents de 0 qui doivent apparaitre mais ils ont l'ai d'etre ignorés... Donc si je veux convertir cette chaine en un Tableau de Bytes, je peux le faire charactére par charactére, mais j'ai que trois caractéres, alors que normalement j'ai recu 1024 octets ... je comprends pas là ...
Message édité par Hrusdik le 04-08-2008 à 16:30:10
Répondre à Hrusdik
| Citation : Hmmm... c'est à dire ?
|
oui c'est ça.
| Citation : Mais ca va pas ralentir le transfert ? |
A 100Mb/s, tu perds quelques nanosecondes par transfert.
Non, là où tu perds du temps le plus c'est dans le décodage et l'encodage des paquets. Ce temps-ci ce qui est négligeable.
Il faut toujours optimiser ce qui est lent, pas ce qui est rapide.
| Citation : Si non la taille est toujours la meme : SizeTransfertPaquet. Donc pas besoin de le preciser non ? |
Au niveau applicatif, je parle de la taille du fichier (peu importe qu'il soit découpé en paquets ou non). Tu fais un protocole applicatif qui ne doit pas intéragir avec le protocole d'une couche plus basse.
| Citation : Ce qui est bizzard c'est que ce code marche avec un server en C++, je pense donc que c'est peut etre ma fonction VB.Net qui ecrit dans le fichier qui est mauvaise ? J'utilise Microsoft.VisualBasic.Put(1,RecievedData,position). Il faut peut etre que j'utilise Microsoft.VisualBasic.FileIO.FileSystem.WriteAllBytes() ? |
En C toutes les fonctions commençant par str... utilisent le '\0' comme caractère de fin, il te faut donc utiliser uniquement memcpy pour avoir le même programme.
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
| CRicky a écrit : En C toutes les fonctions commençant par str... utilisent le '\0' comme caractère de fin, il te faut donc utiliser uniquement memcpy pour avoir le même programme. |
Merci, c'est cela qui bloquait
Merci beaucoup !
Ca marche parfaitement maintenant, le probleme était que je traitais les données qui arrivaient, ce qui fichait en l'air les octets non reconnus ....
Répondre à Hrusdik
Il y a 296 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici.
