Envoi de fichiers par sockets en VB.NET - C#/.NET managed - Programmation
Marsh Posté le 06-04-2006 à 17:32:16
les données qu'on passe à la socket sont sous forme de byte. De ce fait, il est simple de passer un fichier puisqu'un fichier est constitué d'un ensemble de byte.
Maintenant, pour différencier l'envoie de donnée et l'envoie de fichier, il suffit de mettre en place un petit byte qui préciserait le type. et de décoder de l'autre coté
Marsh Posté le 06-04-2006 à 17:49:49
Tu penses donc que je peu utiliser les memes sockets pour l"envoie de fichiers et de messages mais que je dois passer un byte comme parametre a l'envoi pour différencier les transferts.
Je vais essayer mais il y a aussi des notions que je ne comprends pas vraiment... J'ai récupérée un code et donc pour comprendre c''est pas facil!!
Je ne comprends pas dans les fonctions asynchrones comment le client reconnait un envoie du serveur et déclenche la procedure ici le nom est sendcallBack...
Marsh Posté le 06-04-2006 à 20:35:34
dans un échange TCP (donc mode connecté). l'un est en attente d'une réponse et l'autre envoie. De ce fait, l'asynchronisme n'est la que pour rendre l'envoie asynchrone et ne pas bloqué le programme pendant les échanges afin de laisser la main à l'utilisateur sur son programme. Donc ne te préoccupe pas de cela. C'est semblable au Thread, ça permet de faire tourner l'envoie/réception en arriere plan.
l'exemple du byte n'est qu'un exemple, il y a dix milles possibilités.
par exemple, ce qui se fati souvent, c'est lenvoie d'un en tete complémentaire décrivant les données (TCP, UDP, HTTP, POP, SMTP, etc... fonctionne selon se principe en cachant cela aux users).
Marsh Posté le 07-04-2006 à 10:35:34
LE problème c'est que l'envoie de ce byte je ne peu le faire que dans un beginSend non? Or il n'y a pas d'options qui le permet...
Enfin bon je crois je suis vraiment pas douée
Marsh Posté le 07-04-2006 à 12:02:49
Pour etre plus précise je pense qu'en fait la solution est d'avoir deux fonctions asynchrones différentes une pour les messages et une autre pour les fichiers mais je n'arrive pas a le mettre en place.
Lors de mes tests, a chaque fois, il part dans les fonctions des messages et puis fait comme si s'etait un message... CAR la fonction BeginReceive appelle la fonction de gestion des messages.
Marsh Posté le 07-04-2006 à 15:46:56
2 fonctions asynchrones n'est pas une bonne idée.
Rien ne t'assure de la fiabilité des données. Ex, tu reçois une demandes d'info alors que tu es en train de recupérer un fichier.
C'est source à embrouilles.
Tu dois formaliser les données que tu envoies :
- Tu attends qqch.
- Tu reçois une trame (on va supposer que tu codes tes infos sur 4 octets).
- Tu décodes ces 4 octets, qui t'indiques que tu vas recevoir un fichier binaire de 230ko.
- Tu sais que tu dois lire 230ko de données pour en faire un fichier.
- Tu repasses en écoute, et tu attends la prochaine instruction.
Marsh Posté le 07-04-2006 à 16:06:25
Ok merci je vais essayer parceque la franchement je commence a manquer d'idée.
Donc il faudrait que j'envoie avant chaque envoi de fichier ou de messages un message qui fait comprendre au programme quel type de structure je vais envoyer.
Bon j'essaye et je te tiens au courant.
MERCI!!
Marsh Posté le 07-04-2006 à 16:40:35
généralement ce que moi je fais, il ne faut surtout pas envoyer de INT, FLOAT sur le réseau (problème de compatibilité avec certain système).
Donc ce que tu fais
Envoie une chaine de caractère de 4 bytes
=> "FILE" pour fichier
=> "DATA" pour normal
Envoie une chaine de caractère de 10 bytes pour la taille qui va suivre.
Puis tu envoie le reste
Donc la trame ressemblerait à ça:
- Header (14 bytes)
>FILE______1024<
- Data (longueur spécifié dans le header).
Comme ça coté client, tu lit 14 bytes, tu sais que les 4 premiers donne le type. Et les dix dernier donne la longueur en bytes. Suffit de bouclé après correctement jusqu'a avoir lu toutes les données...
C'est aussi simple que ça
Marsh Posté le 07-04-2006 à 17:08:13
oulalalallalala tu me fais rire la
c'est aussi simple que ca bon heu oui peut etre mais bon moi je trouve pas trop
Donc a ce que j'ai compris tu rajoute ces trames a ton buffer que tu envoie en fait c'est ca?
Marsh Posté le 07-04-2006 à 17:35:42
oui et juste quelques autres questions , quels méthodes tu utilises pour rajouter tes entetes a ton buffer? et est ce que tu remplis ton buffer et tu rajoutes lesen têtes apres ou alors l'inverse?
Merci merci merci
Marsh Posté le 07-04-2006 à 18:10:45
saikal a écrit : oui et juste quelques autres questions , quels méthodes tu utilises pour rajouter tes entetes a ton buffer? et est ce que tu remplis ton buffer et tu rajoutes lesen têtes apres ou alors l'inverse? |
tu as un buffer d'envoie. Tu fais comme tu veux, mais ça doit partir, donc vaux mieux construire ton buffer de bytes correctement. Il est facile par exemple de convertir de chaine de caractère (string) vers un tableau de bytes.
exemple:
Code :
|
Et pour la lecture, tu fais tout dans le sens inverse.
Tu lis 14 bytes (4 pour le type, 10 pour la taille).
Puis tu fais en concéquence.
PS: l'entete tjs en premier, sinon il n'a pas de sens. Le but est que le client ne lise d'abord que l'entete puis réagit en conséquence. :s C'est les bases de la programmation réseau
Marsh Posté le 06-04-2006 à 10:50:18
Bonjour,
J'ai besoin de créer une application en VB.NET qui permet d'envoyer et de récupérer des messages ainsi que d'envoyer et de récupérer des fichiers.J'utilise donc une socket cliente et une serveur pour le transfert de message.
Je crois que pour le passage de fichier, je peu utiliser les memes sockets non?
Dans ce cas, j e ne comprends pas comment lui faire comprendre quand il doit passer dans les methodes de conception et de transmission de fichiers....
Bref je suis un peu perdue dans mes sockets