IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau C Discussion :

dois-je faire un Flush de socket ? si oui comment?


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 18
    Par défaut dois-je faire un Flush de socket ? si oui comment?
    Hello tous,

    PRINCIPE :
    Je dispose d'un soft qui gère la communication zigbee (communication sans fils), les trame zigbee reçue sont parsée et les données utiles extraites. Ces données sont ensuite communiquée à un autre logiciel par l'intermédiaire d'un socket TCP/IP.

    Le soft zigbee possède la fonction socket serveur dans son code et écrit sur le socket serveur les données dès réceptions d'un datagramme zigbee.

    Le soft destination est lui connecté comme client et récupère donc les données sur le socket avant de les traiter.

    PROBLEME :

    De manière "aléatoire" (* voir plus bas) j'ai de temps en temps un délais qui apparait entre le data reçu par zigbee et celui lu sur le socket.
    Je m'explique :

    Imaginon que j'envoie la donée suivante par zigbee : A=20 pendant un temps long.
    Je verrai sur le socket la bonne donnée et tout va bien dans les meilleures des mondes.
    maintenant imaginons que A=23, côté reception et parsing je vois bien "23" et cette valeur est mise sur le socket. mais sur le socket côté client je lis toujours "20". et ce pendant un temps relativement long. Comme si le socket avait un buffer.


    * : note sur "aléatoire" : je ne parviens pas à reproduire le problème à volonté. Il se peut que ça apparaisse après 4h de fonctionnement, comme après 2jours, 2 semaines, voir même 1 mois...

    QUESTIONS :

    L'idée serait qu'il y a au niveau de ma communication socket un buffer (??) qu'il faudrait que je vide à un certain moment. Est-ce un raisonnement logique?

    Si oui comment faire ce flush?? fflush(fd) n'est pas la solution à mon avis, je dois faire un flush du handle et pas du file descriptor.


    Quelqu'un a une idée ? une piste?


    Merci pour votre aide

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 18
    Par défaut
    personne n'aurait une petite idée? comment faire un flush le socket?

    dans le genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    printf("hello world");
    fflush(stdout);

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 752
    Par défaut
    Bonsoir,
    Citation Envoyé par Efhache84 Voir le message
    Imaginon que j'envoie la donée suivante par zigbee : A=20 pendant un temps long.
    Je suppose que la phrase: "j'envoie la donnée suivante par zigbee : A=20 pendant un temps long.", signifie que l'émetteur écrit "A=20" comme un petit fou ou plutôt assez vite pour que le récepteur n'ai pas forcément le temps de lire tous les "A=20" qui ont été émis.

    Dans ce cas, les "A=20" s'accumulent dans des "buffers" locaux à chaque systèmes dont la taille dépend du paramétrage système et de la mémoire disponible à l'instant t.

    Lire plus vite, écrire plus lentement ou avoir une sorte de mécanisme d'acquittement... je ne vois pas trop que faire.
    -W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 18
    Par défaut
    Le système écrit actuellement à raison d'une trame de 16 bits (transmise par l'éther) toute les 5 secondes... j'avais aussi songé à cela mais ca ne me semblait pas crédible que 5 secondes entre chaque trame soit trop rapide. Toutefois j'ai modifié ma config pour obtenir une trame par 15 minutes... le soucis reste le même

    par contre par l'utilisation de syslog et autre j'ai pû déduire quelle fonction est "fautive" (celle qui envoit effectivement les données utiles sur socket). Dans cette fonction je découvre ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    struct NodeListe *temp=malloc(sizeof(struct NodeListe));
        temp = NodeListe_returnElement64(nListing,packet->rxFrame.rxDest64);
    Et aucun free à la fin de cette fonction (et il n'y a pas de raison de garder ce temp puisque il est crée dans la fonction (appellée à chaque envoie sur le socket, donc après chaque réception d'une trame zigbee).

    Deux choses me chiffone

    1°) En C, je n'ai pas souvenir qu'il y ait une gestion automatique de la libération de la mémoire (garbage collector ou autre) de ce fait l'appel de la fonction free() est nécessaire. Me trompe-je?

    2°) malloc() renvoit un pointeur est-il logique de retrouver l'assignation d'un poiteur par un pointeur? ne devrait-on pas avoir qqch du style bien que ici il y a création d'une structure ce qui nécessite un pointeur.


    j'avoue que l'ensemble du code n'est pas de moi et que le C date un peu pour moi, donc il se peut que je dise des bêtises et/ou que certaines évidences m'échappent... soyez donc indulgent

  5. #5
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    1°) En C, je n'ai pas souvenir qu'il y ait une gestion automatique de la libération de la mémoire (garbage collector ou autre) de ce fait l'appel de la fonction free() est nécessaire. Me trompe-je?
    Non. mais ce free() est peut être fait ailleurs si la valeur obtenue par le malloc est retournée par la fonction. Si il a été omis, il y a une fuite de mémoire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    struct NodeListe *temp=malloc(sizeof(struct NodeListe));
        temp = NodeListe_returnElement64(nListing,packet->rxFrame.rxDest64);
    Ce qui me choque dans ce code, c'est que la première ligne alloue de la mémoire et met l'adresse dans temp, et que la seconde ligne s'empresse d'écraser la valeur obtenue par autre chose. A quoi alors sert le malloc ? A obtenir une fuite mémoire ?

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 18
    Par défaut
    il n'y avait pas de free() et en effet le malloc était innutile... j'ai viré ce malloc le problème semble être résolu (en ajoutant quelques nettoyage surnuméraire).

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/08/2006, 19h22
  2. changement de tarif - comment dois je faire ?
    Par Luc01 dans le forum Access
    Réponses: 11
    Dernier message: 06/08/2006, 09h10
  3. Que dois je faire?
    Par Andrejimmy dans le forum Delphi
    Réponses: 14
    Dernier message: 03/08/2006, 23h43
  4. En cas de Démission, dois je faire le préavis ?
    Par fabio59 dans le forum Démission
    Réponses: 13
    Dernier message: 27/03/2006, 19h37
  5. Que dois-je faire pour ne pas imprimer l'url de ma page ????
    Par pontus21 dans le forum Général Conception Web
    Réponses: 3
    Dernier message: 01/06/2005, 20h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo