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 :

[Winsock] WSASendTo implementation interne


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juillet 2008
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 29
    Par défaut [Winsock] WSASendTo implementation interne
    ( j'avais posté ce message ailleurs mais n'ayant pas de réponse je pense que je me suis trompé de lieu )

    Je suis en train de travailler sur l'implémentation d'u protocole Haut débit (voir très ). J'ai toujours utiliser les méthodes posix d'écriture socket ( send/sendto, recv/recvFrom ).

    J'ai vu que WSASendTo permet d'envoyer plusieurs buffers ( visiblement en les concatenant dans une seule et meme trame ) avec le meme appel.

    La question que je me pose est la suivante : en interne, comment cela se passe t'il ? copie des buffers dans une meme mémoire puis envoie ? Utilisation de descriteurs chainés à destination du DMA pour un envoie "en direct" ? ou autre ?

    Autres questions :
    - A quoi sert l'overlapp ? ON parle de chevauchement d'E/S ... c'est pas clair pour moi
    - Les callBack "completion routine " sont executées dans quel contexte ?

  2. #2
    Membre averti
    Inscrit en
    Juillet 2008
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 29
    Par défaut

    comme d'ab windows on sait ce que ca fait mais on sait pas comment ca le fait !
    pfff

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par jnussas Voir le message

    comme d'ab windows on sait ce que ca fait mais on sait pas comment ca le fait !
    pfff
    L'implémentation relève du droit de la propriété industrielle de Micro$oft. Donc, c'est pas anormale que le code ne soit pas public!
    Citation Envoyé par jnussas Voir le message
    A quoi sert l'overlapp ? ON parle de chevauchement d'E/S ... c'est pas clair pour moi
    De mémoire, et si je ne dis pas de bêtise, ça sert à travailler en asynchrone sans passer par le mode non bloquant au niveau des sockets. Il y a aussi une optimisation des buffers utilisés puisque ceux-ci sont fournis par l'appelant et sont supposés être valide jusqu'à l'exécution de la 'completion routine'.

    Citation Envoyé par jnussas Voir le message
    Les callBack "completion routine " sont executées dans quel contexte ?
    Je ne comprend pas forcément la question donc la réponse va peut être tombée à côte: les callBack sont appelées dans le cadre du thread courant.

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Je ne parlerai dans cette réponse que du mode "completion routine", je ne connais pas le mode overlapped.

    Dans ce mode, tu crées un pool de thread (en général, un par CPU ou par coeur) et tu associe ces threads avec un completion port.

    Ensuite, à chaque fois que tu crées une socket, tu associes aussi cette socket avec le completion port.

    Lorsqu'une action peut être réalisée sur un des sockets associé au completion port (read possible, fin de write, accept entrant, close reçu), un des thread associés au completion port est réveillé afin de faire le boulot. Donc les routines sont appelées dans le contexte d'un des threads associé au completion port et pas de le contexte du thread utilisateur.

    Ce mode est le mode le plus performant des différents modes possible pour travailler avec les socket, c'est aussi (à mon avis) le plus délicat à comprendre et à mettre en oeuvre.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    Membre averti
    Inscrit en
    Juillet 2008
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 29
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Je ne parlerai dans cette réponse que du mode "completion routine", je ne connais pas le mode overlapped.

    Dans ce mode, tu crées un pool de thread (en général, un par CPU ou par coeur) et tu associe ces threads avec un completion port.

    Ensuite, à chaque fois que tu crées une socket, tu associes aussi cette socket avec le completion port.

    Lorsqu'une action peut être réalisée sur un des sockets associé au completion port (read possible, fin de write, accept entrant, close reçu), un des thread associés au completion port est réveillé afin de faire le boulot. Donc les routines sont appelées dans le contexte d'un des threads associé au completion port et pas de le contexte du thread utilisateur.

    Ce mode est le mode le plus performant des différents modes possible pour travailler avec les socket, c'est aussi (à mon avis) le plus délicat à comprendre et à mettre en oeuvre.


    Pour voir si j'ai bien compris : en gros on a un thread "OS" par methode asynchrone et avec une priorité plus élevée que le thread utlisateur. Ce thread étant réveillé sur evenement système

  6. #6
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Je ne sais pas ce que tu sous entends pas thread OS mais c'est un thread créé par l'application/l'utilisateur.

    La priorité, c'est celle fixée par le programme (effectivement, je les boost un peu pour les mettre en priorité élevée mais c'est mon choix)

    Par contre, j'ai pas compris le "par méthode asynchrone".

    Le fonctionnement global,
    • tu crées un completion port.
    • tu crées autant de thread que tu veux (1 par coeur/cpu) que tu mets en attente bloquante sur le complétion port.
    • Tu crées tes sockets en les liant avec ce completion port
    • dès qu'il y a un événement à traiter, un des thread est débloqué (tu ne sais jamais lequel) et il doit traiter l'événement puis revenir attendre sur le completion port


    Cela parait simple comme cela mais la mécanique à mettre en oeuvre est plus complexe que cela.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par jnussas Voir le message
    Je suis en train de travailler sur l'implémentation d'u protocole Haut débit (voir très ). J'ai toujours utiliser les méthodes posix d'écriture socket ( send/sendto, recv/recvFrom ).
    recvfrom()...

    J'ai vu que WSASendTo permet d'envoyer plusieurs buffers ( visiblement en les concatenant dans une seule et meme trame ) avec le meme appel.
    Je déconseille l'usage de fonctions non portables. Commence déjà avec sendto(), quitte à faire une boucle et un découpage si nécessaire...

    http://emmanuel-delahaye.developpez....eaux.htm#texte

    La question que je me pose est la suivante : en interne, comment cela se passe t'il ?
    Demande le gentiment à Bill Gates. Les sources ne sont pas publics.

    Autres questions :
    - A quoi sert l'overlapp ? ON parle de chevauchement d'E/S ... c'est pas clair pour moi
    Ca sert quand on met en place l'abominable mécanisme de sockets asynchrone. Si tu débutes en programmation, contente toi du mode synchrone. Il est probablement largement suffisant pour ton application.

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

    - Les callBack "completion routine " sont executées dans quel contexte ?
    Mode asynchrone, pour signaler que le travail est terminé. Normal, puis qu'on est en asynchrone, on reprend la main tout de suite. Si on ne veut pas écrabouiller les données, il faut bien un mécanisme pour dire qu'on peut continuer... Tout celà est très complexe, et inutile si on utilise correctement les threads.

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

  8. #8
    Membre averti
    Inscrit en
    Juillet 2008
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 29
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    recvfrom()...
    mon petit doigt gauche en fait qu'a sa tete

    Citation Envoyé par Emmanuel Delahaye Voir le message
    Je déconseille l'usage de fonctions non portables. Commence déjà avec sendto(), quitte à faire une boucle et un découpage si nécessaire...
    La contrainte est la vitesse du protocole et les plateformes de destination, il faut donc éviter memcpy et ses camardes... ( i.e. sous VxW, un zéro copy buffer existe => chaine de descripteur de buffers le DMA se charge de passer la chaine au chipset ETH )

    Bien entendu je veux faire du code portable en prenant en compte les plateformes BSD,WIN et voire posix : ma question etait destinée à l' implementation du wrapper pour WIN.
    On aurait pu utiliser un BOOST ( ou equivalent ) mais c'est pas le choix initial !

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par jnussas Voir le message
    La contrainte est la vitesse du protocole et les plateformes de destination, il faut donc éviter memcpy et ses camardes...
    Rien de tel dans l'exemple que j'ai donné (sur mon site). Le découpage se fait naturellement sans copie (visible).

    Avant de te poser des questions sur l'implémentation, fait des essais de performances.

Discussions similaires

  1. Winsock : WSASendTo implementation interne
    Par jnussas dans le forum Bibliothèques
    Réponses: 0
    Dernier message: 24/11/2008, 10h14
  2. Erreur ldap_add: Internal (implementation specific) e
    Par Cyber@l dans le forum Réseau
    Réponses: 2
    Dernier message: 19/04/2005, 15h03
  3. [Winsock] Envoi et recupération d'une image
    Par arnolanf dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 29/11/2002, 08h49
  4. [VB6] [Winsock] Trouver un port libre
    Par Yann dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 14/10/2002, 11h23
  5. [Kylix] equivalent winsock avec kylix
    Par Victor dans le forum EDI
    Réponses: 2
    Dernier message: 08/05/2002, 07h43

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