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 :

Transmission/Réception partielle de structure via socket


Sujet :

Réseau C

  1. #1
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 022
    Points : 2 273
    Points
    2 273
    Par défaut Transmission/Réception partielle de structure via socket
    Bonjour,
    pourrait-on me confirmer que la continuité des données en mémoire d'une structure n'est pas garantie ? Mon idée est la suivante pour la définition d'une structure de requête de client à serveur. Mettons que pour une requête de type 0 on doive transmettre data1 et pour une requête de type 1 on doive transmettre data1 et data2 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct {
    	int requestType; 		
    	int data1;
    	char[20] data2;
    	//etc...
    } request;
    Le client envoie toujours la même structure mais pas forcément en entier, ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    request req;
    //...
    // Type 0, envoi de requestType et data1 uniquement (2 int)
    ret = send(socket, (void*)&req, sizeof(int) * 2, 0);
     
    // Type 1, envoi de requestType, data1 et data 2
    ret = send(socket, (void*)&req, sizeof(int) * 2 + sizeof(char) * 20, 0);
    Et du côté du serveur la réception se fait en fonction de requestType, ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    request req;
    //...
    // Réception du type de requête
    ret = recv(socket, (void*)req->requestType, sizeOf(req.requestType), 0);
    // Poursuite de la lecture des données
    if(req->requestType > -1)  {
    	ret = recv(socket, (void*)req->data1, sizeOf(req.data1), 0);
    	if(req->requestType > 0)  {
    		ret = recv(socket, (void*)req.data2, sizeOf(req.data2) * 20, 0);
    	}
    	//etc.
    }
    Pensez-vous que ce principe puisse fonctionner ? (a priori je dirais que non)
    Merci d'avance.
    (Je vais essayer de mon côté mais je n'ai pas de compilateur sous la main.
    Vive les roues en pierre

  2. #2
    Membre éprouvé Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Points : 1 132
    Points
    1 132
    Par défaut
    Les éléments de la structure seront adjacents, mais pour des soucis d'alignement il se pourrait qu'il y ai des trous entre ces derniers ainsi qu'à la fin de la structure, auquel cas ceci ne fonctionnerais pas :
    Code Djakisback : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    request req;
    //...
    // Type 0, envoi de requestType et data1 uniquement (2 int)
    ret = send(socket, (void*)&req, sizeof(int) * 2, 0);
     
    // Type 1, envoi de requestType, data1 et data 2
    ret = send(socket, (void*)&req, sizeof(int) * 2 + sizeof(char) * 20, 0);
    moi je procéderais en plusieurs temps comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    send(socket, &req.requestType, sizeof req.requestType, 0);
    send(socket, &req.data1, sizeof req.data1, 0);
    /* ...et ainsi de suite */
    To start press any key. (reading screen) Where's the "any" key? I see Esc, Catarl, and Pig Up. There doesn't seem to be any "any" key. Wo! All this computer hacking is making me thirsty. I think I'll order a Tab. (presses TAB key). -- HOMER --

  3. #3
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 022
    Points : 2 273
    Points
    2 273
    Par défaut
    Salut et merci pour ta réponse

    Citation Envoyé par ssmario2 Voir le message
    Les éléments de la structure seront adjacents, mais pour des soucis d'alignement il se pourrait qu'il y ai des trous entre les derniers ainsi qu'à la fin de la structure, auquel cas ceci ne fonctionnerais pas
    Effectivement je m'attendais à un truc du style ^^
    Oui, donc si je fais l'envoi en plusieurs fois ça fonctionnera mais dans ce cas la structure n'a d'intérêt que pour le stockage local des données, dommage je trouvais l'idée sympa.

    En gros de ce que je comprends, on a le choix entre :
    - avoir plusieurs structures pour différents type de requêtes et complexifier le code serveur/client
    - utiliser une structure de requête générique. Donc avoir du code simplifié mais envoyer des octets inutiles car non initialisés
    Vive les roues en pierre

  4. #4
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par Djakisback Voir le message
    Oui, donc si je fais l'envoi en plusieurs fois ça fonctionnera mais dans ce cas la structure n'a d'intérêt que pour le stockage local des données, dommage je trouvais l'idée sympa.
    En fait, tu peux avoir deux parties plus ou moins distinctes pour ta structure : la partie "commune", déterminant notamment le type de requête, et la partie variable (dont la taille reste à définir par protocole et/ou par un champ de taille dans la requête elle-même). Pour émettre la partie commune (et surtout, en avoir la taille), il te suffit de faire la différence entre l'adresse du premier champ variable et l'adresse du début de la structure : ce sera constant sur la vie du programme, donc à voir si tu initialises une globale avec cette valeur (si c'est calculé systématiquement) ou si l'optimisation permet de le faire via un #define.

    En ce cas, tu effectues seulement deux envois quel que soit la requête : le premier inconditionnellement, le second au sein d'un switch conditionné par l'identifiant de requête. Par contre, cela impose de connaître et de figer l'alignement de ta structure, ainsi que les tailles des données et l'endianness afin de garantir une communication fiable entre le client et le serveur. A titre de simplification, tu peux bien sûr décider d'utiliser du little-endian, mais habituellement, en réseau, c'est plutôt du big-endian que l'on utilise.

    Citation Envoyé par Djakisback Voir le message
    En gros de ce que je comprends, on a le choix entre :
    - avoir plusieurs structures pour différents type de requêtes et complexifier le code serveur/client
    - utiliser une structure de requête générique. Donc avoir du code simplifié mais envoyer des octets inutiles car non initialisés
    Non, une seule structure contenant :
    • Un entête commun à toutes les requêtes (sous-structure ou envoi partiel),
    • Une union de N éléments variables en fonction de la requête définie dans l'entête.


    Dans tous les cas, ne pas figer l'alignement, la taille des données et l'endianness lors d'une communication réseau binaire, c'est plutôt casse-gueule...
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  5. #5
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 022
    Points : 2 273
    Points
    2 273
    Par défaut
    Merci pour ces précisions
    Mais à vrai dire je ne comprends pas bien, est-ce que tu aurais un exemple rapide ?
    Car j'ai l'impression que d'après ce que tu dis, ce que je proposais dans mon premier exemple fonctionnerait ? Tu proposes bien d'envoyer la structure en 2 temps ? Mais le problème soulevé par ssmario2 reste le même non ?

    [edit]En réalité, tu proposes d'envoyer une union de N éléments variables en fonction de la requête définie dans l'entête.[/edit] Donc si je comprends bien tu proposes d'envoyer toujours la même taille de données ?
    Vive les roues en pierre

  6. #6
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par Djakisback Voir le message
    Donc si je comprends bien tu proposes d'envoyer toujours la même taille de données ?
    La taille de l'union est certes la taille de la plus grande de ses alternatives... Mais qui a dit que tu étais obligé d'envoyer le sizeof(union), en lieu et place du sizeof() spécifique associé à la requête ?

    En gros (cf. points en rouge) :
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    typedef struct {
      struct header {
        int request_type ;
        int data1 ;
        char common_data[XXX] ;
        .....
      } h ;
      union data {
        struct data_r1 {
          char xxxx ;
        } d1 ;
        struct data_r2 {
          char yyyy[10000] ;
          float zzzz ;
        } d2 ;
        ......
      } d ;
    } request ;
    
    
    int send_request ( int socket, request* req ) {
    
      int ret ;
    
      ret = send(socket,&(req->h),sizeof(req->h),0);
      if (ret==0)
        switch (req->h.request_type) {
          case REQUEST1 :
            ret = send(socket,&(req->d.d1),sizeof(req->d.d1),0);
            break ;
    
          case REQUEST2 :
            ret = send(socket,&(req->d.d2),sizeof(req->d.d2),0);
            break ;
    
          default :
            ret = -1 ;
            break ;
        }
        return ret ;
    }
    C'est plus clair ?
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  7. #7
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 022
    Points : 2 273
    Points
    2 273
    Par défaut
    Oui merci c'est plus clair
    Ca permet donc d'utiliser un seul type, le type 'request' et de ne faire que 2 envois, comme tu le disais (cette technique est pas mal du tout ^^).
    En revanche, quand tu parles de fixer l'alignement, je ne comprends pas pourquoi cela peut poser un problème de ne pas le faire avec cette méthode ?
    Vive les roues en pierre

  8. #8
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Parce que l'alignement ne sera pas forcément le même entre un code compilé avec Visual Studio, GCC, pour Windows ou Linux, sans parler des machines 64 bits et/ou ayant une endianness différente de ta machine de développement.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  9. #9
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 022
    Points : 2 273
    Points
    2 273
    Par défaut
    ok, merci pour tout
    Effectivement, je n'avais pas pensé à ça.
    Je vais donc partir sur cette méthode.
    Vive les roues en pierre

  10. #10
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par Djakisback Voir le message
    ok, merci pour tout
    Effectivement, je n'avais pas pensé à ça.
    Je vais donc partir sur cette méthode.
    De rien.

    Je sais que ce genre de technique fait un peu "hack" sur les bords, mais c'est un truc assez courant au niveau d'une pile réseau afin de garantir des performances un minimum décentes.
    Si tu peux assurer la présence de toutes les parties de l'union au même offset dans la structure (ça se teste facilement), tu peux carrément faire un seul envoi en sommant directement la taille de l'entête et des données, et en envoyant la structure de base avec cette somme : il te suffit alors de faire le switch avant, de préparer la taille des données, puis d'expédier le tout d'un bloc.

    Par contre, garantir que les composants d'une union seront systématiquement alignés sur le même offset de la structure englobante peut poser quelques soucis. C'est négligeable lorsque l'on vérifie tout (inclus endianness), mais ça peut être source d'erreurs sur un code fait exclusivement pour une seule cible (et donc, moins "blindé" côté alignement).
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  11. #11
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    disons que tant que les réseaux n'étaient pas très rapide, c'était un moyen efficace de communication directe..


    Cela devient maintenant plus un inconvénient majeur (liens extrêmemement violents d'un binaire à l'autre) qu'un avantage..

    Un passage "explicite" de la structure par mots clés est certainement le plus adapté de nos jours (et depuis un bon moment)..
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  12. #12
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    disons que tant que les réseaux n'étaient pas très rapide, c'était un moyen efficace de communication directe..

    Cela devient maintenant plus un inconvénient majeur (liens extrêmemement violents d'un binaire à l'autre) qu'un avantage..

    Un passage "explicite" de la structure par mots clés est certainement le plus adapté de nos jours (et depuis un bon moment)..
    Je nuancerais un peu plus : tout dépend du niveau du protocole dans le modèle OSI... Si c'est le dernier (le plus haut), la communication non-binaire est souvent préférable pour des raisons de portabilité (cf. HTTP, FTP, SMTP, etc. qui fonctionnent ainsi).
    En dessous, ou sur les bus de terrain, c'est par contre strictement nécessaire, notamment lorsque l'on n'a pas le choix du format de trame : il vaut mieux dans ce cas savoir comment ça marche et comment on résout le problème, par exemple en le faisant au moins une fois.

    Réimplémenter TCP/IP en mode "texte" plutôt que binaire serait par exemple une énorme régression sur les performances...
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  13. #13
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Un gros inconvénient du texte, c'est le fait de ne pas connaître la taille à l'avance. Même si je suppose qu'il y a des limites dans les normes.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  14. #14
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Mac LAK Voir le message
    Je nuancerais un peu plus : tout dépend du niveau du protocole dans le modèle OSI... Si c'est le dernier (le plus haut), la communication non-binaire est souvent préférable pour des raisons de portabilité (cf. HTTP, FTP, SMTP, etc. qui fonctionnent ainsi).
    En dessous, ou sur les bus de terrain, c'est par contre strictement nécessaire, notamment lorsque l'on n'a pas le choix du format de trame : il vaut mieux dans ce cas savoir comment ça marche et comment on résout le problème, par exemple en le faisant au moins une fois.

    Réimplémenter TCP/IP en mode "texte" plutôt que binaire serait par exemple une énorme régression sur les performances...
    C'est sûr, mais vu la question du PO, et celles en général posées ici, les POs ne travaillent pas sur des bus..

    Dans le cadre d'un logiciel, même très complexe, mais ayant par exemple 6 ou 7 binaires distincts, pouvant tourner sur des machines distinctes, mais nécessitant un temps réponse "quasi-réel", ce qui pouvait se comprendre à la fin des annes 80 st aujourdhui largement dépassé et contraignant..

    J'ai eu il y a maintenant presque 2 ans à travailler sur un simulateur d'aéroport, dont la structure était celle-ci, toutes les structure se passant en binaires..

    L'imposition de mise à jour (et de compilation) de l'ensemble alors qu'on ne rajoutait qu'un flag utile juste entre 2 binaires devenait rhédibitoire (6h de compil)..


    L'avantage d'un protocole ASCII de passage de structures étant justement la possible hétérogénéité des versions, pour peu que les mots ne changent pas, mais qu'ils s'en rajoutent..




    Citation Envoyé par Médinoc Voir le message
    Un gros inconvénient du texte, c'est le fait de ne pas connaître la taille à l'avance. Même si je suppose qu'il y a des limites dans les normes.
    Euh.. Je ne vois pas de quoi tu parles...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  15. #15
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Tu ne connais pas à l'avance la longueur d'une ligne, donc la meilleure taille pour ton buffer.
    Alors qu'en binaire, tu peux toujours te faire un format avec la taille en premier, puis les données...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  16. #16
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    qu'est-ce que ça a à voir, la taille d'une ligne, dans un protocole ASCII ?




    Tu envoies un message de 1000, 4000, 100000 caractères d'affilée, ça ne pose aucun problème ..

    On en donne ici des exemples régulièrement..

    Tu peux très bien faire un bloc de 60 000 caractères sans faire de retour à la ligne..

    Je ne vois pas où tu vois un problème...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    while socket != empty
       recv..
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  17. #17
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    Tu peux très bien faire un bloc de 60 000 caractères sans faire de retour à la ligne..

    Je ne vois pas où tu vois un problème...
    Mais c'est justement le problème. La plupart des protocoles ASCII sont gérés au niveau ligne, donc tu te retrouves à avoir besoin de realloc() en boucle avant de pouvoir commencer à interpréter la demande du client!

    ...Ou bien, tu fixes une taille maximale et pour tout ce qui dépasse, tu retournes HTTP 414: Way Too F#%&ing Long.

    Désolé si j'ai l'air d'avoir un poil dans la main, mais moi je préfère connaître à l'avance la taille que je suis censé recevoir. Je n'aime pas les realloc() en boucle, donc si je peux faire autrement, je ne m'en prive pas.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  18. #18
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Mais c'est justement le problème. La plupart des protocoles ASCII sont gérés au niveau ligne, donc tu te retrouves à avoir besoin de realloc() en boucle avant de pouvoir commencer à interpréter la demande du client!

    ...Ou bien, tu fixes une taille maximale et pour tout ce qui dépasse, tu retournes HTTP 414: Way Too F#%&ing Long.

    Désolé si j'ai l'air d'avoir un poil dans la main, mais moi je préfère connaître à l'avance la taille que je suis censé recevoir. Je n'aime pas les realloc() en boucle, donc si je peux faire autrement, je ne m'en prive pas.

    tu parles de protocoles ASCII...



    LESQUELS SONT GERES AU NIVEAU LIGNE ???

    Pas un protocole digne de ce nom..

    Maintenant, si tu ne souhaites pas faire de rzlloc, c'est on choix, mais ça n'est pas celui qui est en général..

    Et de plus, dans le cas du passage de strcutures, faut pas charrier, un tableau de 5 à 10 000 caractères devrait suffire à passer de TRES grosses strcutures complexes..


    Moi je passais des grilles de modèles atmosphériques de la Terre en une seule fois... (avec non seulement les coordonées des points (lat/lon) mais par exemple la valeur des températures ou des vents, le tout dans le même message...

    Donc plutôt des séries de points..

    Mais passer une structure, même si elle a 50 ou 60 paramètres, c'est pas la mort...


    Tu peux par exemple faire des buffers de 10 000, et éventuellement réallouer par pas de 10 000...

    Franchement, je ne vois pas le problème..


    D'ailleurs, c'est ce que (devrait) faire un navigateur/interpreteur HTML, puisque rien n'est dans la nome HTML pour des retours charriots.. Donc tout une page pourrait être sur une seule ligne... (on en avait déjà parlé ailleurs, il me semble (et j'avais trouvé ça absurde))..
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  19. #19
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    C'est sûr, mais vu la question du PO, et celles en général posées ici, les POs ne travaillent pas sur des bus..
    Pas gagné d'avance, j'ai déjà vu des questions sur Modbus ou des protocoles bas niveau (type RS-232) ici...

    Citation Envoyé par souviron34 Voir le message
    L'imposition de mise à jour (et de compilation) de l'ensemble alors qu'on ne rajoutait qu'un flag utile juste entre 2 binaires devenait rhédibitoire (6h de compil)..
    Je dirais "structure binaire mal conçue", car binaire ne veut pas dire non-évolutif (exemple concret : payload d'une trame Ethernet / IP / UDP / TCP, vraiment au hasard).
    Certes, c'est plus contraignant en binaire qu'en ASCII.

    Toutefois, il est illusoire de croire que ce n'était utile que dans les années 80 : c'est non seulement toujours d'actualité, très vastement utilisé, et comme je le précisais les protocoles courant de transport (Ethernet et TCP/IP principalement) sont basés sur ce principe.
    Côté "autres bus / protocoles", tu peux avoir, en vrac : CAN, MVB, Arinc, Modbus, AFDX, USB, FireWire, PCI / PCIe, et de façon générale toute communication avec un (micro)contrôleur et autres DSP / FPGA...

    Citation Envoyé par souviron34 Voir le message
    L'avantage d'un protocole ASCII de passage de structures étant justement la possible hétérogénéité des versions, pour peu que les mots ne changent pas, mais qu'ils s'en rajoutent..
    La même chose est possible en binaire, à condition d'avoir prévu à la base d'utiliser un champ "version" et un champ "taille" faisant partie intégrante du message.
    Cependant, même en ASCII, ça peut planter : j'ai déjà vu (souvent) ce genre de protocole planter parce qu'une clé inconnue est considérée comme une erreur lexicale, et envoie donc gentiment la trame aux orties...

    De plus, l'ASCII ne règle QUE le problème d'endianness et d'alignement. Il te reste toujours le problème des tailles des données (réadaptation dynamique à chaque valeur et/ou réservation maximale), et tu peux introduire des nouveaux problèmes qui peuvent devenir velus (au hasard, l'Unicode et l'encodage des caractères). De plus, en fonction de la cible choisie, la (dé)sérialisation des données vers de l'ASCII peut devenir assez vite un gouffre à temps CPU. Enfin, le C n'est pas aussi bien équipé que le C++ à ce niveau, ce qui oblige soit à faire des send unitaires (risque de fragmentation lourde sur le réseau), soit à utiliser des buffers monstrueux...


    @Médinoc : +1, j'ai également horreur des réallocations sauvages au milieu des boucles de réception... Si l'on veut un truc robuste, cela finit en général par un automate à états alimenté par le flux de données, et c'est franchement pénible au final.

    Citation Envoyé par souviron34 Voir le message
    tu parles de protocoles ASCII...
    LESQUELS SONT GERES AU NIVEAU LIGNE ???

    ...

    D'ailleurs, c'est ce que (devrait) faire un navigateur/interpreteur HTML, puisque rien n'est dans la nome HTML pour des retours charriots.. Donc tout une page pourrait être sur une seule ligne... (on en avait déjà parlé ailleurs, il me semble (et j'avais trouvé ça absurde))..
    HTML n'est pas un protocole : c'est HTTP qui est dessous la plupart du temps... Et ce protocole, comme Telnet, FTP ou encore SMTP/POP3, impose une commande ligne par ligne, et des fins de lignes normalisées (CR/LF, d'ailleurs).

    Ce qui n'empêche absolument pas d'expédier la page sous forme d'une seule ligne, d'ailleurs, c'est même une technique de "compression" des pages HTML assez utilisée. Et derrière, ben il faut réussir à la supporter au niveau du client HTTP, avant de la passer à l'interpréteur HTML...
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  20. #20
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    tu parles de protocoles ASCII...



    LESQUELS SONT GERES AU NIVEAU LIGNE ???

    Pas un protocole digne de ce nom..
    Euh... HTTP, FTP, SMTP (j'ai déjà bossé avec les deux derniers par Telnet, à des fins de débogage) ne sont pas des protocoles dignes de ce nom?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réception et envoie simultané via la même socket
    Par deripaske dans le forum Réseau
    Réponses: 2
    Dernier message: 01/03/2011, 18h29
  2. Envoi d'une structure via sockets
    Par milanoran dans le forum C++
    Réponses: 8
    Dernier message: 17/11/2010, 14h19
  3. Envoi de structure via socket
    Par RoZyk dans le forum Réseau
    Réponses: 4
    Dernier message: 09/11/2010, 10h01
  4. Réponses: 0
    Dernier message: 06/03/2009, 21h31
  5. [C#] Problème transmission via socket
    Par LE NEINDRE dans le forum Windows Forms
    Réponses: 2
    Dernier message: 11/07/2006, 08h29

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