Send() et recv()

StayCrunchy Messages postés 43 Date d'inscription mercredi 24 novembre 2010 Statut Membre Dernière intervention 26 février 2014 - 27 nov. 2012 à 14:48
 jav974 - 3 déc. 2012 à 21:26
Bonjour,

Cherchant des réponses à certaines questions que je me pose par rapport à
l'utilisation des fonctions send() et recv(), j'ai procédé à quelques recherches.
(Mon but final est de réaliser des échanges rapides ET fiables.)

Je suis tombé sur ce post : http://www.cppfrance.com/forum/sujet-FONCTIONS-SEND-RECV_193293.aspx

J'ai posté il y a peu un message sur le forum "Transmission de fichiers"
y indiquant un problème rencontré.

Je procédais ainsi, utilisant send et recv :
      receptionBlocs.c :           envoiBlocs.c:
while
{
    1) send(num de bloc)   ---->   recv(num de bloc) // servant en quelque sorte de témoin pour être 
                                                    //sur que les deux machines en sont au même point.
    2) recv(donnees)       <----   send(donnees)
}


Cependant, dans le message que j'ai trouvé sur ce site, on suggère de juste
vérifier que le nombre des données transmises correspond au nombre de données
qui auraient du être envoyées.

J'ai donc repris mes deux fichiers sources et apporté les modifications :
         receptionBlocs.c :         envoiBlocs.c:
while
{
   // 1) send(num de bloc)   ---->   recv(num de bloc) // plus besoin de ceci, 
                                                      //car pas besoin de synchroniser selon le post.
      2) recv(données)       <----   send(données)  // juste un send() et un recv() dans un while 
                                                  //en contrôlant le nombre de données envoyées et reçues.
}


Les deux programmes fonctionnent mais je constate que la machine réceptionnant les
données ne reçoit que 2 fois sur 3 le nombre exact d’éléments que l'autre machine envoie.
Deux bonnes réception toujours suivies d'une incomplète.
100% des fois où des données sont perdues, c'est le même nombre d’éléments qui sont
reçus. Ce ne semble donc pas aléatoire ...

Rapport de données envoyées:
 ok  ok  ok  ok  ok  ok  ok  ok  ok
512 512 512 512 512 512 512 512 512
 
Rapport de données reçues:
 ok  ok  ..  ok  ok  ..  ok  ok  ..
512 512 424 512 512 424 512 512 424 


Selon vous :
-Sans même avoir pu lire mes sources, ces méthodes sont-elles viables ?
-Quelle méthode serait le mieux adaptée pour transmettre des fichiers sans perte de
données ?
-Comment procédez-vous vous-même pour établir des échanges de données rapides et
sans erreur?

Il s'agit des principales questions que je me pose... j'en ai beaucoup d'autres ...
Je n'attends pas une réponse pour chacune de mes questions, mais si vous avez
des informations qui pourraient me permettre d'avancer, je suis preneur !

Merci

1 réponse

Bonjour,

les questions que tu poses sont assez vastes, mais sur le principe il n'y a pas de problème. Quelque soit l'implémentation possible d'un transfert de fichier ou de n'importe quoi, on passera forcément par une fonction bas niveau comme un simple send et recv. Maintenant, dans beaucoup de cas, on tend à envoyer un header avant le fichier (ou partie) qui indiquerait notamment la taille du paquet à recevoir, éventuellement le type aussi. L'idée c'est que le header doit toujours avoir une taille fixe, et l'on doit continuer à lire les données reçues avant de les traiter tant que la taille d'un header n'est pas arrivé. Ensuite la même avec les données correspondant au fichier en lui même (après avoir extrait les infos utiles du header).

Voilà tout, la réponse arrive un peu tard, tu as peut-être trouvé réponse à ta question et si oui, merci à toi de poster ce que tu as fait, que ça puisse profiter à d'autres ;)

jav
0
Rejoignez-nous