+ Répondre à la discussion
Affichage des résultats 1 à 4 sur 4
  1. #1
    Candidat au titre de Membre du Club
    Inscrit en
    octobre 2006
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : octobre 2006
    Messages : 21
    Points : 12
    Points
    12

    Par défaut [Performances] Appels répétés de 'recv()'

    Bonjour !

    Je suis en train de bidouiller un petit programme de type client pour un jeu assez connu.
    Ce jeu défini un protocole réseau, qui consiste en un certain nombre de "packets" pouvant contenir des données (int, short, string, etc...) dans un ordre ou dans un autre.

    Par exemple, le packet de type A va contenir deux int, puis un short, suivi d'un string. (quand je parle de packets, je ne parle pas des couches réseau inférieures).

    Or donc, pour récupérer les données du packet A, je procède comme suite :
    Code :
    1
    2
    3
    4
    5
     
    int a = recupererInt();
    int b = recupererInt();
    short c = recupererShort();
    string s = recupererString();
    Chacun de ces petites fonctions fait un appel à "recv()" sur une SOCKET et limite l'arrivée des données à la taille du type spécifié. En gros, j'utilise le système de file proposé par "recv()" pour arriver à mes fins.

    Ma question est donc : Es-ce la bonne approche ? Dans d'autre programmes, je vois souvent des fonctions récupérant des gros buffers (1024 octets par exemple) pour ensuite les reparser, les caster, ou les copier pour récupérer les types. Ce qui me gêne, c'est qu'un tel système refait - à mon sens - ce que "recv()" fait déjà : Mettre les éléments en mémoire en attendant leur lecture/utilisation.


    Bref, j'aimerais avoir votre avis là dessus (récupérer beaucoup de data, puis l'interprêter, ou bien récuperer les data par petits bouts).
    Mes deux critères sont :
    - Faible consommation en mémoire / processeur
    - Rapidité des communications réseau


    Je vous remercie par avance.


    EDIT : Finalement, la même question se pose pour "send()", sauf que là je suis encore moins sûr de moi (si j'appelle deux fois "send()", es-ce que le kernel va attendre les deux appels avant d'envoyer les data par le socket ? En principe, c'est une des fonctionnalités de cette couche)

  2. #2
    Membre confirmé
    Homme Profil pro
    Java Analyst Developer
    Inscrit en
    mai 2011
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : Belgique

    Informations professionnelles :
    Activité : Java Analyst Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mai 2011
    Messages : 129
    Points : 293
    Points
    293

    Par défaut

    Juste pour information, tu peux te tourner vers l'envoie de structure ;-)
    Kinaesthetic project

    • Une réponse pertinente ? Alors le bouton pouce vert +1 indique votre accord avec la solution proposée.

    • Une discussion est terminée ? Alors le bouton est votre ami !

  3. #3
    Candidat au titre de Membre du Club
    Inscrit en
    octobre 2006
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : octobre 2006
    Messages : 21
    Points : 12
    Points
    12

    Par défaut

    Impossible, car les types string (pouvant être présents au beau milieu d'un packet) sont de taille variable. (et la taille totale du packet n'est pas indiquée au début de celui-ci), donc ce n'est qu'une fois tous les string lus que je peux déterminer la terminaison d'un packet.

  4. #4
    Candidat au titre de Membre du Club
    Inscrit en
    octobre 2006
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : octobre 2006
    Messages : 21
    Points : 12
    Points
    12

    Par défaut

    Des élements de réponse intéressants pour ceux que ça intéresserait quand même :
    http://stackoverflow.com/questions/4...ible-scenarios

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •