Précédent   Forum du club des développeurs et IT Pro > C et C++ > C > Réseau
Réseau Forum d'entraide sur la programmation réseau en C
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 05/11/2012, 10h36   #1
tenebriox
Membre du Club
 
Avatar de tenebriox
 
Flo
Inscription : juin 2009
Messages : 88
Détails du profil
Informations personnelles :
Nom : Flo

Informations forums :
Inscription : juin 2009
Messages : 88
Points : 69
Points : 69
Par défaut Problème client/serveur UDP (fiabilisation des transferts)

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 ^^
tenebriox est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/11/2012, 08h08   #2
Bktero
Expert Confirmé Sénior
 
Avatar de Bktero
 
Ingénieur systèmes embarqués
Inscription : juin 2009
Messages : 1 699
Détails du profil
Informations personnelles :
Âge : 25
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Ingénieur systèmes embarqués
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2009
Messages : 1 699
Points : 4 155
Points : 4 155
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é !
Bktero est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/11/2012, 15h07   #3
xilebo
Membre à l'essai
 
Inscription : octobre 2004
Messages : 56
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 56
Points : 20
Points : 20
Envoyer un message via ICQ à xilebo Envoyer un message via MSN à xilebo
Citation:
Envoyé par tenebriox Voir le message
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 ^^
Salut,

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 )
xilebo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 07h51.


 
 
 
 
Partenaires

Hébergement Web