|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre du Club
![]() Flo Inscription : juin 2009 Messages : 88 ![]() |
Bonjour à tous,
Je souhaiterais mettre en oeuvre un client/serveur en UDP mais qui soit mieux fiabilisé que le protocole de base... Pour des besoins principalement de temps réel, je suis obligé de passer par UDP, et je souhaiterais dans un premier temps détecter une perte de paquet. Voici comment j'ai décomposé mon programme : emetteur.c : envoie un fichier texte au serveur receveur.c : en attente de réception socket.c : permet la création de sockets udp (grâce aux fonctions d'envoi/réception) contenues dans protocole.c protocole.c : contient notamment les fonctions envoi/réception au lieu de send/recv. Ce que je veux faire concrètement, c'est dans mon protocole.c : - lorsque je reçois un paquet, je mets à jour le dernier num d'acquittement - lorsque j'envoie un paquet, j'inclus dans un nouveau header le dernier num d'acquittement Ceci va être un premier pas vers l'acquittement de paquets mais mon principal problème c'est que le receveur et l'émetteur fonctionnent de manière unidirectionnelle si je puis dire. C'est à dire que chacun ne fait qu'envoyer ou que recevoir. J'ai pensé à envoyer un message "bidon" quand le receveur reçoit un paquet. Et idem pour l'émetteur : après envoi d'un paquet, on scrute si des données sont dispos le socket avec select. Donc, vous allez me dire que tout devrait fonctionner maintenant ?! Et bien non !! J'ai un gros problème au niveau de la "bidirectionnalité" ! Mon émetteur/receveur ont la même IP locale (127.0.0.1) et écoutent le même port.... Du coup par exemple mon receveur capte lui même le paquet qu'il envoie à destination de l'émetteur... Je peux fournir le code si besoin Bravo si vous m'avez lu jusqu'au bout, et si vous avez des idées, que ce soit pour implémenter les acks différemment, ou pour mon problème de bidirectionnalité n'hésitez pas, je vous attends ^^ |
|
|
00
|
|
|
#2 |
|
Expert Confirmé Sénior
![]() ![]() Ingénieur systèmes embarqués Inscription : juin 2009 Messages : 1 699 ![]() |
Et si tu essayes avec 2 PC distincts, il se passe quoi ? Ici, le problème vient plutôt de la méthode de tests que de la méthode d'acknowlegment.
__________________
Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseigner ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^ Pour vos problèmes d'embarqué, utilisez le forum dédié ! |
|
00
|
|
|
#3 | |
|
Membre à l'essai
![]() |
Citation:
C'est normal que tu recoives le paquet que tu as émis , il te suffit de le jeter ( de détecter que c'est toi même en regardant l'adresse de l'émetteur ), et de faire un send recvfrom pour recevoir le paquet que tu attends. Sinon, tu peux également positionner la socket pour ne pas recevoir tes propres paquets, cela se fait en broadcast, mais je ne vois pas pourquoi on ne pourrait pas le faire en unicast ( je ne me souviens plus de l'appel système ) |
|
|
|
00
|
Copyright © 2000-2013 - www.developpez.com