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 :

multiplexage quand tu nous tiens


Sujet :

Réseau C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut multiplexage quand tu nous tiens
    Salut !

    Dans le cadre de mon boulot, j'utilise les sockets et je fais du multiplexage.
    Je crée mon buffer multiplexé (qui contient des entêtes et des données) et j'envoie le tout avec writev(&fd,Mux_Buffer,size) (size < IOV_MAX)

    Tout va presque bien ... sauf que sur 10 exécutions 6 fois j'ai un résultat et 4 fois j'en ai un autre.

    Je me demande donc si j'ai pas un pb avec la taille de la socket ...
    ma question : y a-t-il une taille max de données qu'on peut écrire sur une socket ?

    merci d'avance

    pour info, le code en question

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    /* Création du buffer multiplexé */
    		  pt_mess = (thePort->input->data);
    		  memcpy( &Mux_Buffer[3*IDX], &(thePort->iPort), sizeof(thePort->iPort));
    		  currentBufSize  = currentBufSize + thePort->iPort.iov_len;
    		  printf("Mux_Buffer[%d] = %d\n",3*IDX,Mux_Buffer[3*IDX]);
    		  memcpy( &Mux_Buffer[3*IDX + 1], &(thePort->iTaille), sizeof(struct iovec));
    		  currentBufSize  = currentBufSize + thePort->iTaille.iov_len;
    		  printf("Mux_Buffer[%d] = %d\n",3*IDX+1,Mux_Buffer[3*IDX+1]);
    		  memcpy( &Mux_Buffer[3*IDX + 2], pt_mess, sizeof(struct iovec));
    		  currentBufSize = currentBufSize + thePort->input->data->iov_len;
    		  printf("Mux_Buffer[%d] = %d\n",3*IDX+2,Mux_Buffer[3*IDX+2]);
     
    		  IDX++;
    Com_Sampling_Mux_Buffer_Send(&Mux_Buffer[formerIdx],(3*IDX)-formerIdx);
     
    code de  Com_Sampling_Mux_Buffer_Send
     
    void Com_Sampling_Mux_Buffer_Send(struct iovec * Mux_Buffer,int size)
    {
      struct fd_set  fd;
      struct timeval time_out;
      long           status;
      int            handle;
      int            rwrite;
     
     
      if(Mux_Buffer == NULL)
        return;
     
      if(size == 0)
        return;
     
     
      FD_ZERO(&fd);                 //!< Initialize structure
      FD_SET(descOutput, &fd);        //!< Set structure to current socket
      time_out.tv_sec  = 0;         //!< wait socket delay
      time_out.tv_usec = 0;
     
      status = select((descOutput + 1), NULL, &fd, NULL, &time_out);
     
      if(status > 0)
        {
          printf("SizeSent = %d\n",size);
          rwrite = writev(descOutput, Mux_Buffer, size);
          printf("-------- rwrite = %d---------\n",rwrite);
        }
      else
        {
          perror();
        }
    }

  2. #2
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    y a-t-il une taille max de données qu'on peut écrire sur une socket ?
    Oui !
    Et cela dépend des OS.

    Le mieux est de découper dans une taille prédéfini ton buffer et faire des envoies répétitifs

    ex:
    Tailles des données à envoyer 456
    On dit que la taille du buffer est de 200

    Donc 3 envoies
    200
    200
    56
    Ce n'est qu'un exemple et les chiffres ne sont la que pour expliciter mon point de vu.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    pas si évident que cela d'envoyer une taille fixe.

    Mon Mux_Buffer est un constitué d'une grande quantité de triplets
    1.Taille d'un port (tjours 2octets dans mon prog)
    2.Taille du message qui va suivre (tjours 2octets dans mon prog)
    3.Message en lui-même (de taille variable) que je ne peux pas diviser en plusieurs messages

    ces triplets sont en grands nombre

    et je fais un writev(&fd, &Mux_Buffer[1], taille (tjours un multiple de 3) )

    ...
    donc envoyer une taille X fixe à chaque fois m'est impossible

    d'autres idées ...svp ??

  4. #4
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    3.Message en lui-même (de taille variable) que je ne peux pas diviser en plusieurs messages

    Pourquoi cela gêne ?

    Tu peux réécrire une couche de transport de haut niveau qui indique le nombre de structures que tu vas passer disons 20 avec une taille totale de 456 comme tout à l'heure.

    Dans ton socket, tu indiques la taille totale des données, ensuite le nombre de structures, ensuite les données.

    Avant envoie tu bufferises tout comme avant dans ton buffer de taille x (qui est variables)
    Et ensuite tu découpes par paquet de 200 le tout
    Tu reconstitues dans un buffer de taille X sur le client (réalloué pour tenir comptes de la taille des données envoyées, grâce à la taille totale des données qui est envoyé en entête du socket)

    Toutes les valeurs données étant à titre d’exemple.

  5. #5
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Août 2006
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2006
    Messages : 44
    Points : 28
    Points
    28
    Par défaut langage
    Mon cher fabrizzio,
    tu dis que du fait du multiplexage et tout le tralala,il te serais 20 fois plus facile de programmer en ABEL-HDL qu'en langage C,crois moi!!!

  6. #6
    Membre éprouvé Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Points : 1 260
    Points
    1 260
    Par défaut
    il te serais 20 fois plus facile de programmer en ABEL-HDL qu'en langage C
    C'est quoi ça ???
    [alkama] quelqu'un est allé voir la guerre des mondes?
    [@Chrisman] j'espère pour spielberg
    --- bashfr.org

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par mehdi.berra
    Mon cher fabrizzio,
    tu dis que du fait du multiplexage et tout le tralala,il te serais 20 fois plus facile de programmer en ABEL-HDL qu'en langage C,crois moi!!!
    sauf que je suis en entreprise et que le langage c'est pas vraiment un choix,
    enfin pas le mien en tous les cas !
    Donc ce sera en C

  8. #8
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Août 2006
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2006
    Messages : 44
    Points : 28
    Points
    28
    Par défaut oulala
    Mais c'est tout a fait dommage mon tres cher
    je suis navré pour vous,je dirai meme consterner

  9. #9
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut
    Le HDL pour Hardware Description Language, dont le verilog et le VHDL sont utilisés essentiellement sur FPGA.

    Alors juste comme cela, ce n'est pas une question de chance mais de processeur sur lequel on travaille.

    Quoique, il il y a des outils qui tendent à convertir du C en VHDL (cf catapult).

  10. #10
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Citation Envoyé par mehdi.berra
    Mon cher fabrizzio,
    tu dis que du fait du multiplexage et tout le tralala,il te serais 20 fois plus facile de programmer en ABEL-HDL qu'en langage C,crois moi!!!
    Si c'est cela, je ne vois pas en quoi cela aurait pu l'aider d'écrire en langage de haut niveau pour des circuits électroniques ??, j'ai peut être raté un passage...

  11. #11
    Membre éprouvé Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Points : 1 260
    Points
    1 260
    Par défaut
    C'est vrai que je ne vois pas non plus en quoi ça serait mieux que le C...
    [alkama] quelqu'un est allé voir la guerre des mondes?
    [@Chrisman] j'espère pour spielberg
    --- bashfr.org

  12. #12
    Membre chevronné
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 413
    Points : 1 993
    Points
    1 993
    Par défaut
    COMMENTAIRE:

    A mon humble avis, le mot multiplexage est la source de la confusion.
    Bien le bonjour chez vous
    Jowo

  13. #13
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut
    Si c'est cela, je ne vois pas en quoi cela aurait pu l'aider d'écrire en langage de haut niveau pour des circuits électroniques ??,
    Pour moi, le VHDL n'est pas un language haut niveau mais un language de description pour la conception de circuits intégrés numériques.

    Après synthétisation du langage, tout se ramène à l'utilisation de portes logiques, de bascules, de registres... D'ailleurs l'optimisation du code se joue dans l'utilisation de ses ressources disponibles selon le composant numérique.

    C'est vrai que je ne vois pas non plus en quoi ça serait mieux que le C...
    C'est réellement deux choses différentes et donc deux approches différentes.
    Il est clair que générer un multiplexeur en VHDL est réellement très simple puisqu'il suffit de décrire le fonctionnement.

  14. #14
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Citation Envoyé par homeostasie
    Il est clair que générer un multiplexeur en VHDL est réellement très simple puisqu'il suffit de décrire le fonctionnement.
    On est d'accord... mais rien à voir avec le problème de Fabrizzio33 et ces sockets...

  15. #15
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    j'ai avancé un poil

    perror() me renvoie : connection refused
    alors qu'errno vaut 61 : ENODATA

    voilà où j'en suis

    j'ai vérifié que memcpy renvoyait bien ce qu'il fallait, c ok

    traces obtenues
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
     
    ++++++++++++++++++++++
    TAILLE MESSAGE = 24
    NEXT CurrentBufSize = 440
    &(thePort->iPort) = 1074781640
    &(thePort->iTaille) = 1074781656
    CurrentBufSize = 440
    +++++++++++++++++++++++
    TAILLE MESSAGE = 124
    NEXT CurrentBufSize = 568
    ======= OVER SIZE SOCKET  => MULTIPLEX BUFFER TO SEND =======
    SizeSent = 48
    -------- rwrite = 628---------
    formerIdx = 339  nbSentItems= 48
    &(thePort->iPort) = 1074781800
    &(thePort->iTaille) = 1074781816
    CurrentBufSize = 128
    +++++++++++++++++++++++
    TAILLE MESSAGE = 24
    NEXT CurrentBufSize = 156
    &(thePort->iPort) = 1074781960
    &(thePort->iTaille) = 1074781976
    CurrentBufSize = 156
    +++++++++++++++++++++++
    TAILLE MESSAGE = 12
    NEXT CurrentBufSize = 172
    &(thePort->iPort) = 1074782120
    &(thePort->iTaille) = 1074782136
    CurrentBufSize = 172
    +++++++++++++++++++++++
    TAILLE MESSAGE = 12
    NEXT CurrentBufSize = 188
    &(thePort->iPort) = 1074782280
    &(thePort->iTaille) = 1074782296
    CurrentBufSize = 188
    +++++++++++++++++++++++
    TAILLE MESSAGE = 12
    NEXT CurrentBufSize = 204
    &(thePort->iPort) = 1074782440
    &(thePort->iTaille) = 1074782456
    CurrentBufSize = 204
    +++++++++++++++++++++++
    TAILLE MESSAGE = 24
    NEXT CurrentBufSize = 232
    &(thePort->iPort) = 1074782600
    &(thePort->iTaille) = 1074782616
    CurrentBufSize = 232
    +++++++++++++++++++++++
    TAILLE MESSAGE = 44
    NEXT CurrentBufSize = 280
    &(thePort->iPort) = 1074782760
    &(thePort->iTaille) = 1074782776
    CurrentBufSize = 280
    +++++++++++++++++++++++
    TAILLE MESSAGE = 12
    NEXT CurrentBufSize = 296
    &(thePort->iPort) = 1074782920
    &(thePort->iTaille) = 1074782936
    CurrentBufSize = 296
    +++++++++++++++++++++++
    TAILLE MESSAGE = 76
    NEXT CurrentBufSize = 376
    &(thePort->iPort) = 1074783080
    &(thePort->iTaille) = 1074783096
    CurrentBufSize = 376
    +++++++++++++++++++++++
    TAILLE MESSAGE = 16
    NEXT CurrentBufSize = 396
    &(thePort->iPort) = 1074783240
    &(thePort->iTaille) = 1074783256
    CurrentBufSize = 396
    +++++++++++++++++++++++
    TAILLE MESSAGE = 32
    NEXT CurrentBufSize = 432
    &(thePort->iPort) = 1074783400
    &(thePort->iTaille) = 1074783416
    CurrentBufSize = 432
    +++++++++++++++++++++++
    TAILLE MESSAGE = 24
    NEXT CurrentBufSize = 460
    &(thePort->iPort) = 1074783560
    &(thePort->iTaille) = 1074783576
    CurrentBufSize = 460
    +++++++++++++++++++++++
    TAILLE MESSAGE = 20
    NEXT CurrentBufSize = 484
    &(thePort->iPort) = 1074783720
    &(thePort->iTaille) = 1074783736
    CurrentBufSize = 484
    +++++++++++++++++++++++
    TAILLE MESSAGE = 12
    NEXT CurrentBufSize = 500
    &(thePort->iPort) = 1074783880
    &(thePort->iTaille) = 1074783896
    CurrentBufSize = 500
    +++++++++++++++++++++++
    TAILLE MESSAGE = 12
    NEXT CurrentBufSize = 516
    ======= OVER SIZE SOCKET  => MULTIPLEX BUFFER TO SEND =======
    SizeSent = 42
    -------- rwrite = -1---------
    erreur writev: Connection refused
     errno = 61
    formerIdx = 387  nbSentItems= 42
    &(thePort->iPort) = 1074784040
    &(thePort->iTaille) = 1074784056
    CurrentBufSize = 16
    du coup, je comprends tjours pas ...


    En gros, certains writev fonctionnent et d'autres non
    la taille limité que j'ai fixé pour le writev est 512
    si currentBufSize<IOV_MAX/2, on continue,
    sinon, on envoie le Mux_Buffer et writev renvoie le nb d'octects écrits

    voilà l'histoire,

    si vous avez des propositions ...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AJAX] Ajax quand tu nous tiens
    Par Florent08800 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 11/08/2007, 21h38
  2. [FRAME] Quand tu nous tiens
    Par hisy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 07/07/2006, 08h27
  3. [Sessions] Session quand tu nous tiens
    Par arti2004 dans le forum Langage
    Réponses: 10
    Dernier message: 27/05/2006, 19h19
  4. Regex quand tu nous tiens !!!
    Par calimero642 dans le forum Langage
    Réponses: 9
    Dernier message: 22/03/2006, 14h33
  5. [object HTMLSelectElement] IE quand tu nous tiens
    Par NeHuS dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 11/03/2006, 08h26

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