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 :

Protocole - échange de données entre serveur et clients


Sujet :

Réseau C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 56
    Points : 27
    Points
    27
    Par défaut Protocole - échange de données entre serveur et clients
    Bonjour !

    j essaye d apprendre à utiliser un protocole de communication pour la lumière , qui se nomme Art-Net.
    (specs: http://www.artisticlicence.com/WebSi...es/art-net.pdf ) Attention je n utilise que 3 functions de ce protocole ( qui est maousse costaud: ArtPoll ArtPollReply et ArtDmx)

    Ce protocole me pose quelques petits soucis sur le dialogue client/serveur/client. En fait je suis vraiment assez newbie sur les histoires de réseaux

    j ai trois cas de figure:
    A/
    Le serveur Poll sur le réseau pour savoir si il y a des clients
    Les clients lui renvoient une PollReply qu il faut lire et analyser ( retirer les IP et les identifiants)

    B/
    Le client Poll sur le réseau savoir si il y a un serveur à bord
    Le serveur lui renvoie une réponse de qui il est

    C/
    Le client renvoit des données au serveur dans un train de 529 char.
    ( cas de figure pas encore écrit)

    Un message Poll fait 13 char
    Un ArtPollReply en fait 239
    Un message ArtDmx en fait 529

    Ci dessous est une boucle test, avant d injecter tout celà dans mon app.

    J'ai l impression en fait de freezer mon test avec mes if((bytesreceived =())== la largeur du message attendu).
    Serait ce une erreur grossière d'approche ?

    Voilà ! merci de vos conseils !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    while (index_quit==0)
        {
    if(bytesreceived=recvfrom(sock,ReceivedArtPollBuffer,sizeof(ReceivedArtPollBuffer),0,(SOCKADDR*)&sin,&sinsize)==13)   
        { //an artPolling is received from outside, we need to reply
        if( AnalysePolling(ReceivedArtPollBuffer)==1)
        {
         nbrbytessended=sendto(sock, ArtPollReplyBuffer,sizeof( ArtPollReplyBuffer),0,(SOCKADDR*)&sin,sinsize);
         }
        }
         else if(bytesreceived=recvfrom(sock,ReceivedArtPollReplyBuffer,sizeof(ReceivedArtPollReplyBuffer),0,(SOCKADDR*)&sin,&sinsize)==239)   
        {//an ArtPollReply is done by node, we want to analyse it AnalyseArtPollReply();                                                                          
        }
        Sleep(1);
        if(_kbhit()){index_quit=1;}      
        }

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par karistouf Voir le message
    Ci dessous est une boucle test, avant d injecter tout celà dans mon app.

    J'ai l impression en fait de freezer mon test avec mes if((bytesreceived =())== la largeur du message attendu).
    Serait ce une erreur grossière d'approche ?
    Ta boucle est mal faite. Dans une boucle de reception, il ne doit y avoir qu'une fonction de reception.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while (!end)
    {
       recevoir()
       renvoyer()
    }
    C'est en analysant ce qui a été reçu que l'on décide de faire tel ou tel traitement. Mais on ne peut pas faire d'hypothèses à priori. On ne sait pas ce qu'on va recevoir

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 56
    Points : 27
    Points
    27
    Par défaut
    bonjour emmanuel. merci. oui bien sur pour les fonctions de reception et d emission. evidemment ! je poste des exemples de tests. j essaye et je regarde. je n ai meme pas de timer, du coup dans ma boucle while c est peut etre celà qui coince.

    je ne sais pas ce qui peut arriver, en effet, mais je sais dejà plusieurs choses: le nombre de bytes des chaines attendues , et ensuite leur composition via leur protocole , ou il y a un header bien precis que je peux comparer, et ainsi lancer ou pas le processus d importation des données.

    ma question, pour etre plus précis, c est :
    est ce que dire que
    -si je recois un paquet de la taille attendue -> je lance le processus d analyse, ca marche ?
    aka: dire que si je recois un paquet de ==13 ou ==239 c est valable ? Celà m arrangerait beaucoup parceque dans mon programme où j incorpore tout celà j ai deux entrées: une à 10 bytes et une à 120 bytes, avec plein de petits exe externes maison pour ces entrées la. Je precise que c est de l application en réseau perso, pas sur le net

    -ou bien faut il etre flegmatique et dire j ai buffer de 1000 char dans lequel rentre tout ce qui arrive et ensuite je tries ?

    voilà ! merci des réponses emmanuel !

  4. #4
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par karistouf Voir le message
    bonjour emmanuel. merci. oui bien sur pour les fonctions de reception et d emission. evidemment ! je poste des exemples de tests. j essaye et je regarde. je n ai meme pas de timer, du coup dans ma boucle while c est peut etre celà qui coince.

    je ne sais pas ce qui peut arriver, en effet, mais je sais dejà plusieurs choses: le nombre de bytes des chaines attendues , et ensuite leur composition via leur protocole , ou il y a un header bien precis que je peux comparer, et ainsi lancer ou pas le processus d importation des données.

    ma question, pour etre plus précis, c est :
    est ce que dire que
    -si je recois un paquet de la taille attendue -> je lance le processus d analyse, ca marche ?
    Tout dépend du protocole. Le nombre de bytes reçu est une information qui te dit combien de bytes ont été lus par la fonction de réception (recvfrom). Ça ne donne pas d'indication sur le format de la trame. C'est à toi ensuite de chercher le header dans ce qui a été reçu et de compter les bytes de façon à repérer les données qui t'intéressent.

    Il faut comprendre que malgré leurs noms, les fonctions recv*() ne sont pas des fonctions de réception (évidemment, ça n'aurait aucun sens), mais des fonctions de lecture du flux reçu (comme le très standard fread() ou le très POSIX.1 read(). Donc si physiquement, la machine a reçu une trame de 10 bytes, puis une trame de 50 bytes, et que tu fait un read de 100 bytes, la fonction de lecture va retourner 60 et mettre les 60 bytes dans le tableau. Est-ce bien clair ?

    Par contre on pourrait demander une fois 10 bytes, puis une autre fois 50 bytes, et dans ce cas on aurait effectivement les 2 trames séparées à condition d'être certain de la synchro.

    Si le protocole garanti que la première trame reçue fait 10 bytes, et que la 2ème fait 50 bytes, on peut faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    n = recv...(...data,  10)
    if (n == 10)
    {
       traitement_a(data, 10)
       n = recv...(...data,  50)
       if (n == 50)
       {
          traitement_a(data, 50)
    mais il faut aussi traiter les cas d'erreur, penser à vider les flux etc.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 56
    Points : 27
    Points
    27
    Par défaut
    l faut comprendre que malgré leurs noms, les fonctions recv*() ne sont pas des fonctions de réception (évidemment, ça n'aurait aucun sens), mais des fonctions de lecture du flux reçu (comme le tr_s standard fread() ou le très POSIX.1 read(). Donc si physiquement, la machine a reçu une trame de 10 bytes, pouis une trame de 50 bytes, et que tu fait un read de 100 bytes, la fonction de lecture va retourner 60 et mettre les 60 bytes dans le tableau. Est-ce bien clair ?
    c est très clair emmanuel!
    tu viens de soulever un voile enorme ( pour mes yeux)! sur cette histoire que recvfrom n est qu une recuperation du flux.

    dans mon precedent thread, apparaissaient en variables globales les declarations des SOCKET etc...
    peux tu me developper l explication de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #define closesocket(s) close (s)
    typedef int SOCKET;
    typedef struct sockaddr_in SOCKADDR_IN;
    typedef struct sockaddr SOCKADDR;
    ?

    désolé pour ces questions dans tous les sens ( d où l histoire de mettre le post en "debuter"). je fais dans l autodidacte et j ai pris des mauvais plis ... besoin de remettre plein de choses à plat.

  6. #6
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par karistouf Voir le message
    peux tu me developper l explication de :
    ce sont des macros et des définitions pour assurer la portabilité entre POSIX (unixoides) et Windows
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    /* pas de 'close' sous Windows, mais 'closesocket'*/
    #define closesocket(s) close (s)
     
    /* definition des types SOCKET, SOCKADDR_IN et SOCKADDR sous POSIX */
    typedef int SOCKET;
    typedef struct sockaddr_in SOCKADDR_IN;
    typedef struct sockaddr SOCKADDR;
    désolé pour ces questions dans tous les sens ( d où l histoire de mettre le post en "debuter"). je fais dans l autodidacte et j ai pris des mauvais plis ... besoin de remettre plein de choses à plat.
    http://emmanuel-delahaye.developpez.com/reseaux.htm

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 56
    Points : 27
    Points
    27
    Par défaut
    super et merci ! voilà en effet de quoi se remettre correctement à plat...

    2 questions: comment procède t on dans les regles de l art lorsque une meme app ecoute ou transmet sur deux ports différents ? ( ca c est pendant que je me penche sur cette doc qui est en francais, yes yes yes ...)

  8. #8
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par karistouf Voir le message
    comment procède t on dans les regles de l art lorsque une meme app ecoute ou transmet sur deux ports différents ?
    Dès qu'on doit gérer plus d'une attente (fonction bloquante) simultanément, il faut
    - soit utiliser select() (mais il y a des restrictions d'usage sous Windows)
    - soit utiliser la programmation concurrente. A mon avis, le plus simple et le plus portable est l'usage des threads POSIX

    http://emmanuel-delahaye.developpez.com/pthreads.htm

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 56
    Points : 27
    Points
    27
    Par défaut
    merci, c est vraiment TRES TRES TRES clair tout celà !
    c'est pour faire avancer plus loin mon bébé:
    http://karistouf.free.fr/schwartzpeter.html

Discussions similaires

  1. Réponses: 3
    Dernier message: 18/02/2015, 18h06
  2. Réponses: 3
    Dernier message: 17/06/2012, 16h36
  3. [MySQL] Échange de données entre 2 serveurs
    Par Jonahboss dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 03/05/2009, 11h02
  4. programme d'échange de données entre client/serveur
    Par g_lahcene dans le forum Réseau
    Réponses: 4
    Dernier message: 04/11/2008, 09h49
  5. [Système] Échange de données entre serveurs
    Par bpriscil dans le forum Langage
    Réponses: 7
    Dernier message: 19/05/2006, 09h51

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