cs_emmanuel9
Messages postés903Date d'inscriptionmercredi 23 février 2005StatutMembreDernière intervention16 juin 2010
-
15 avril 2005 à 10:43
cs_emmanuel9
Messages postés903Date d'inscriptionmercredi 23 février 2005StatutMembreDernière intervention16 juin 2010
-
15 avril 2005 à 13:34
Bonjour à tous,
Je voudrais envoyer un fichier sur le reseau par les socket mais tous le problèmes vient tu faite que le fichier que j'envoi est de taille variable et donc pour parer à ce problème, je me suis dis, je me connecte au serveur, je lui envoi la taille du fichier une premiere fois pour qu'il puisse initialiser le buffer qui va recevoir le fichier et ensuite je lui envoi le fichier en lui même mais j'ai qq soucis. Mais bon sur le reseau on envoi tjs un tableau de byte et en faite toute la question est : si j'envoi une chaine de longeur variable comment le serveur peut t'il connaitre la taille de la chaine que j'envoi pour initialiser son buffer (tableau de byte[]) qui va recevoir ce que je lui envoi.
Voila si qq avait des idées sur le sujet ou même des remarques à faire sur le code ca serait le bienvenue car ca fait un moment que je galère avec ca.
Par avance, merci
Voici le code c'est du c++.net c'est presque pareil que le c# : on remplace juste les fleche par des points
blundle
Messages postés14Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention 4 mai 2005 15 avril 2005 à 12:33
il te faut convertir la taille de ton fichier (un entier) en un tableau de byte.
En mémoire, un int prend 4 bytes...
il te faut donc créer une fonction transformant ton entier en 1 tableau de 4 bytes.
comme ceci, ton entier a donc un valeur et une taille absolue (ton serveur n aura qu a attendre ces 4 bytes avant de commencer la reception de ton fichier).
Si tu veux je t envoie les sources de ces fonctions ce soir ...
Remarque : ce n est pas difficile, il faut jouer avec des décallages...
cs_emmanuel9
Messages postés903Date d'inscriptionmercredi 23 février 2005StatutMembreDernière intervention16 juin 20102 15 avril 2005 à 13:06
Le problème est là, j'ai fais un tableau de byte de 100 pour recevoir les données mais si ca se trouve mon fichier va faire 70000, donc je vais recevoir 700000 byte, de (0 à readbuf.lenght)donc comment je peux savoir la taille que je vais recevoir ?
readbuf = new Byte
__gc[100] ;
s2->BeginReceive(readbuf, 0, readbuf->get_Length(), SocketFlags::None,
new AsyncCallback(
this, &Form1::ReceiveMessageCallback), s2);
En faite ce que tu me dis c'est d'envoyer la taille du fichier au serveur pour qu'il puisse avant pour qu'il puisse connaitre la taille du buffer qui va recevoir le fichier ?
J'ai essayé en faite mais j'ai pas reussi si je vais deux fois coté client beginsend("coco") ; beginsend("toto") ; et que coté serveur je fais deux beginaccept() ; il va m'afficher :
cocototo
cocototo
Je te remercie pour ton aide, ce serait très sympa si tu pouvais m'envoyer ca, un truc simple si possible héhé, car je suis pas encore très au faite sur la communication réseau.
blundle
Messages postés14Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention 4 mai 2005 15 avril 2005 à 13:19
lorsque le client envoie la taille du fichier au serveur.
le serveur doit attendre la taille sur 4 byte, comme ceci
s2->BeginReceive(readbuf, 0, 4, SocketFlags::None, new AsyncCallback(
this, &Form1::ReceiveMessageCallback), s2);
coté client, tu convertis ton entier (taille du fichier) en un tableau de 4 bytes ...
tu envoie ce tableau de 4 byte au serveur.
le serveur lit les 4 bytes et effectue l operation inverse pour transformer le tableau de 4 byte en un entier (int).
Il possede la taille du fichier et peut ainsi allouer le buffer adapté.
J ai procédé comme ceci dans un ping pong multijoueur que j ai devellopé il y a quelque mois et ca marchait tres bien.
Je ne dis pas que c est la meilleur technique mais si quelqu un a un autre procédé plus simple ...
Sinon pour le source, ce sera pas avant ce soir car je ne suis pas chez moi ...
cs_emmanuel9
Messages postés903Date d'inscriptionmercredi 23 février 2005StatutMembreDernière intervention16 juin 20102 15 avril 2005 à 13:25
Le truc que j'ai pas trop compris en faite c'est que si coté client je vais beginsend("bonjour") ;
50 fois coté serveur si je fais beginaccept 1 fois il va me marquer 50 fois bonjour
J'ai pas reussis en faite à separer deux envois different à chaque fois il les colle ensemble.
En tout c'est super sympa de m'envoyer la source ca fait un moment que je suis avec ca.
Vous n’avez pas trouvé la réponse que vous recherchez ?